2016-11-18 1 views
1

Ich versuche, ein Modell mit zwei Primärschlüssel zu aktualisieren.Django Update-Modell mit Composite-Primärschlüssel

Da django nicht offiziell unterstützt, ich bin mit dem Problem zu umgehen:

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) 

Aber wenn ich versuche, ein bestehendes Objekt zu aktualisieren ich die folgende Fehlermeldung erhalten:

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

Ich habe versucht, die folgende, um mein Modell zu aktualisieren:

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

und die folgenden:

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() 

Irgendwelche Ideen, wie ich mein Modell aktualisieren kann, ohne einen Integritätsfehler zu bekommen?

+0

Haben Sie Migrationen ausgeführt, nachdem Sie die Einschränkung 'unique_together' hinzugefügt haben? – falloutcoder

+0

Ja, ich habe auch meine Datenbank zurückgesetzt mit manage.py Flush -> manage.py Makemigrationen -> manage.py migrieren – Ali

+0

Was sind Werte von kw1 und kw2 Variablen? – falloutcoder

Antwort

1

Ich weiß nicht, was das wirkliche Problem verursacht, aber die blank=False und primary_key=True in meinem Modell zu entfernen arbeitete für mich:

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) 

mit

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() 

Vielen Dank für Ihre Hilfe!