我正在尝试将 citus 数据 ( https://www.citusdata.com/ ) 与 Django 一起使用。
到目前为止,除了试图保存一个已经保存的模型外,大多数一切都在工作:
NotSupportedError: modifying the partition value of rows is not allowed
这是因为 django 总是包含更新 SQL 中的每个字段,即使该字段没有更改。
在Citus中,你必须选择一个字段作为你的分区字段,然后你不能改变它。因此,当我保存一个对象时,它不喜欢分区键在更新语句中,即使它没有改变。
我知道您可以将 update_fields 关键字参数传递给 save 方法,但我想知道我是否可以以某种方式告诉 django 在更新时永远不要包含字段?
请您参考如下方法:
Django 不提供这种“开箱即用”的功能。您可以重写类的 save 方法,将分区字段以外的所有字段设置为 update_fields
def save(self, **kwargs):
kwargs.setdefault('update_fields', ['field1', 'field2'])
return super(Class, self).save(**kwargs)
一个更动态的选项,如果你不想每次改变你的类的字段时更新这个方法,将使用 Meta获取类的所有字段并排除您的分区字段的API
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 会尝试使用其他几种方法来更新您的模型。也许您的所有模型都继承自实现这些方法的基类会起作用
