2

我正在尝试将 citus 数据(https://www.citusdata.com/)与 Django 一起使用。

到目前为止,除了尝试save使用已保存的模型外,大多数东西都在工作:

NotSupportedError: modifying the partition value of rows is not allowed

这是因为 django 总是在更新 SQL 中包含每个字段,即使该字段没有更改。

在 Citus 中,您必须选择一个字段作为您的分区字段,然后您无法更改它。所以,当我保存一个对象时,它不喜欢分区键在更新语句中,即使它没有改变。

我知道您可以将update_fields关键字 arg 传递给该save方法,但我想知道是否可以以某种方式告诉 django 在更新时从不包含字段?

4

1 回答 1

4

Django 没有“开箱即用”提供此功能。您可以覆盖save类的方法以将除分区字段以外的所有字段设置为update_fields

def save(self, **kwargs):
    kwargs.setdefault('update_fields', ['field1', 'field2'])
    return super(Class, self).save(**kwargs)

如果您不想在每次更改类的字段时都更新此方法,则更动态的选择是使用MetaAPI 获取类的所有字段并排除您的分区字段

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 将通过其他几种方法尝试更新您的模型。也许您的所有模型都从该实现这些方法继承的基类将起作用

于 2016-08-04T20:21:16.497 回答