2017-05-22 16 views
-1

4つのフィールドにunique_together制約を持つモデルがあります。ただし、通常の検証エラーを発生させる代わりに、古いオブジェクトを削除して新しいオブジェクトに置き換えます(古いものを更新することもできます)。私はこれをやり遂げる方法について、あるいはこの行動を達成するためのより良い方法があるかどうかに関して少し犠牲になっています。新しいオブジェクトを保存して古いオブジェクトを保存するためにunique_together制約を変更する

EDIT:

ちょうどこれら4つのフィールドを持つインスタンスのデータベースをチェックするために保存する方法を変更し、私は1つを見つけた場合、それを削除する任意の欠点?

答えて

1

saveの方法は正常ですが、毎回データベースを取得するため、パフォーマンスが低下する可能性があります。あなたがモデルのマネージャーでこのコードを使用することができます

try: 
    YourModel.objects.create(
     unique_together_field_1, 
     unique_together_field_2, 
     unique_together_field_3, 
     unique_together_field_4, 
     ... 
    ) 
except YourModel.ValidationError: 
    # update or replace the existing model 

EDIT

class YourModelManager(models.Manager): 
    def create(**kwargs): 
     try: 
      super(YourModelManager, self).create(**kwargs) 
     except YourModel.ValidationError: 
      # handle here the error 
      # kwargs is a dictionary with the model fields 

とであなたがValidationErrorを扱う場合は、ニシキヘビ良く、そしてより多くなりますモデル:

class YourModel(models.Model): 
    unique_together_field_1 = .... 
    ... 
    class Meta: 
     unique_together = [...] 

    objects = YourModelManager() 

カスタムマネージャーについてdocsを確認してください。

+0

これはモデル自体になりますか? – thumbtackthief

+0

いいえ、あなたのモデルを作成する場所はどこですか?例えば、「ビュー」の中に –

+0

Gotcha - それは私がいろいろなところでインスタンスを作成すれば、誰かがそのコードを時間。 – thumbtackthief