Django - 保存时永远不要更新列

Django - NEVER update a column when saving

我正在尝试将 citus 数据 (https://www.citusdata.com/) 与 Django 一起使用。

到目前为止,除了尝试 save 一个已经保存的模型外,大部分一切正常:

NotSupportedError: modifying the partition value of rows is not allowed

这是因为 django 始终在更新中包含每个字段 SQL,即使该字段没有更改。

在Citus中,您必须选择一个字段作为您的分区字段,然后您不能更改它。所以,当我保存一个对象时,它不喜欢分区键在更新语句中,即使它没有改变。

我知道您可以将 update_fields 关键字参数传递给 save 方法,但我想知道我是否可以以某种方式告诉 django 在更新时从不包含字段?

Django 不提供此功能"out of the box"。您可以重写 class 的 save 方法,将分区字段以外的所有字段设置为 update_fields

的值
def save(self, **kwargs):
    kwargs.setdefault('update_fields', ['field1', 'field2'])
    return super(Class, self).save(**kwargs)

如果您不想在每次更改 class 的字段时都更新此方法,一个更动态的选项是使用 Meta API 来获取所有class 的字段并排除您的分区字段

def save(self, **kwargs):
    kwargs.setdefault(
        'update_fields',
        [f.name for f in self.__class__._meta.get_fields() if f.name != 'partition_field']
    )
    return super(Class, self).save(**kwargs)

Django 会尝试使用其他几种方法来更新您的模型。也许一个基础 class,您的所有模型都继承自那个实现这些方法的方法会起作用