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 在更新时永远不要包含字段?
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 将尝试使用其他几种方法来更新您的模型。也许所有模型继承的基类都可以实现这些方法