Skip to main content
 首页 » 编程设计

python之Django之保存时永远不要更新列

2024年10月17日32haluo1

我正在尝试将 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 会尝试使用其他几种方法来更新您的模型。也许您的所有模型都继承自实现这些方法的基类会起作用