2016-11-18 23 views
1

2つの主キーを使用してモデルを更新しようとしています。複合プライマリキーを使用したDjangoアップデートモデル

Djangoはそれをサポートして正式ではないので、私はこの問題を回避する使用しています:

class myModel(models.Model): 
    class Meta: 
     unique_together = (('key1', 'key2'),) 

    key1= models.IntegerField(blank=False, primary_key=True) 
    key2= models.CharField(blank=False, max_length=30) 
    attr3 = models.CharField(max_length=30) 
    attr4 = models.CharField(max_length=30) 

をしかし、私は既存のオブジェクトを更新しようとするたびに、私は次のエラーを取得する:

django.db.utils.IntegrityError: UNIQUE constraint failed: myApp_myModell.key1, myApp_myModel.key2 

私が試しました私のモデルを更新するには、次

myModel.objects.update_or_create(
    key1=kw1, 
    key2= kw2, 
    defaults={ 
    'attr3':attr3_str, 
    'attr4':attr4_str, 
    }) 

と、次の

defaults={ 
    'attr3':attr3_str 
    'attr4':attr4_str, 
    } 
try: 
    obj = myModel.objects.get(key1=kw1, key2=kw2) 
    for key, value in defaults: 
     settatr(obj, key, value) 
    obj.save() 
except myModel.DoesNotExist: 
    print("DOESNT EXISIT") 
    new_values = {'key1': kw1, 'key2': kw2} 
    new_values.update(defaults) 
    obj = myModel(**new_values) 
    obj.save() 

どのようにすれば、整合性エラーを取得せずにモデルを更新できますか?

+0

あなたは 'unique_together'制約を追加した後に移行を実行しましたか? – falloutcoder

+0

はい、私も でデータベースをリセットしました。manage.py flush - > manage.py makemigrations - > manage.py migrate – Ali

+0

kw1とkw2変数の値は何ですか? – falloutcoder

答えて

1

私は本当の問題の原因を知っているが、私のモデルにblank=Falseprimary_key=Trueを除去することが私のために働いていない:

class myModel(models.Model): 
    class Meta: 
     unique_together = (('key1', 'key2'),) 

    key1= models.IntegerField() 
    key2= models.CharField(max_length=30) 
    attr3 = models.CharField(max_length=30) 
    attr4 = models.CharField(max_length=30) 

defaults={ 
    'attr3':attr3_str 
    'attr4':attr4_str, 
    } 
try: 
    obj = myModel.objects.get(key1=kw1, key2=kw2) 
    for key, value in defaults: 
     setattr(obj, key, value) 
    obj.save() 
except myModel.DoesNotExist: 
    new_values = {'key1': kw1, 'key2': kw2} 
    new_values.update(defaults) 
    obj = myModel(**new_values) 
    obj.save() 

では、あなたの助けをありがとう!

関連する問題