Django - 保存时切勿更新列

syn*_*nic 2 python django citus

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

到目前为止,除了尝试save已保存的模型之外,大多数内容都正常:

NotSupportedError: modifying the partition value of rows is not allowed
Run Code Online (Sandbox Code Playgroud)

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

在 Citus 中,您必须选择一个字段作为分区字段,然后就无法更改它。因此,当我保存对象时,它不喜欢分区键位于更新语句中,即使它没有更改。

我知道你可以将update_fields关键字 arg 传递给该save方法,但我想知道我是否可以以某种方式告诉 django 在更新时永远不要包含字段?

Iai*_*ton 6

Django 不提供“开箱即用”的此功能。您可以重写save类的方法,将分区字段以外的所有字段设置为update_fields

def save(self, **kwargs):
    kwargs.setdefault('update_fields', ['field1', 'field2'])
    return super(Class, self).save(**kwargs)
Run Code Online (Sandbox Code Playgroud)

如果您不想每次更改类的字段时都更新此方法,则更动态的选项是使用 APIMeta获取类的所有字段并排除分区字段

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)
Run Code Online (Sandbox Code Playgroud)

Django 将尝试使用其他几种方法来更新您的模型。也许所有模型继承的基类都可以实现这些方法