2016-11-18 2 views
1

Я пытаюсь обновить модель с двумя первичными ключами.Модель обновления 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=False и primary_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() 

Спасибо за вашу помощь!

Смежные вопросы