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会尝试更新您的模型。也许你的所有模型继承的基类实现这些方法将工作