2

Django でシタス データ ( https://www.citusdata.com/ ) を使用しようとしています。

saveすでに保存されているモデルを試すことを除いて、これまでのところほとんどすべてが機能しています。

NotSupportedError: modifying the partition value of rows is not allowed

これは、そのフィールドが変更されていない場合でも、django が常にすべてのフィールドを更新 SQL に含めるためです。

Citus では、パーティショニング フィールドとなるフィールドを選択する必要があり、それを変更することはできません。そのため、オブジェクトを保存するときに、たとえ変更されていなくても、パーティション キーが update ステートメントにあるのは好ましくありません。

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 に答える