Django - 在保存时不要更新列
问题描述:
我正尝试在Django中使用citus数据(https://www.citusdata.com/)。Django - 在保存时不要更新列
大多数一切工作,到目前为止,除了试图save
已经被保存了一个模型:
NotSupportedError: modifying the partition value of rows is not allowed
这是因为Django的总是包含在更新SQL每一个领域,即使该领域还没有改变。
在Citus中,您必须选择一个字段作为您的分区字段,然后您无法更改它。所以,当我保存一个对象时,它不喜欢分区键在update语句中,即使它没有改变。
我知道您可以将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)
一个更加动态的选项,如果你不想更新这个方法,每次你改变的领域你的类,将使用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会尝试更新您的模型。也许你的所有模型继承的基类实现这些方法将工作