2016-08-04 6 views
2

Djangoでcitusデータ(https://www.citusdata.com/)を使用しようとしています。Django - 保存時に列を更新しないでください。

ほとんどすべてがsaveにすでに保存されているモデルをしようとして除き、これまでに取り組んでいる:

NotSupportedError: modifying the partition value of rows is not allowed 

Djangoは常にそのフィールドがない場合であっても、更新SQL内のすべての単一のフィールドが含まれているため、これは、かわった。

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

saveメソッドにupdate_fieldsキーワードargを渡すことができますが、どういうわけかdjangoに更新時にフィールドを含めないように伝えることができますか?

答えて

2

Djangoはこの機能を「そのまま」提供しません。あなたは、このメソッドを毎回更新したくない場合は、のフィールドを変更、update_fields

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

よりダイナミックなオプションの値としてパーティションフィールド以外のすべてのフィールドを設定するために、あなたのクラスのsaveメソッドをオーバーライドすることができますあなたのクラスは、Djangoはあなたのモデルを更新しようとしたことにより、他のいくつかの方法があり

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) 

クラスのすべてのフィールドを取得し、パーティションのフィールドを除外するMeta APIを使用することです。たぶん、あなたのすべてのモデルがこれらのメソッドを実装して継承する基本クラスは動作します

関連する問題