2017-03-12 6 views
0

der Aktualisierung Ich habe folgendes ModellDjango neuen Datensatz erstellen, anstatt

class FooBar(models.Model): 
    FOOBAR_ID = models.AutoField(primary_key=True) 
    foo = models.CharField(max_length=255) 
    bar = models.CharField(max_length=255) 

Außerdem habe ich ein Formular erstellt, die mir vorhandene Instanzen von FooBar bearbeiten kann. Ich möchte den vorhandenen Datensatz aktualisieren, wenn foo geändert wird, aber einen neuen Datensatz erstellen, wenn der Balken geändert wird.

dachte ich, eine gute Möglichkeit wäre, zu gehen, die speichern Methode außer Kraft zu setzen, da es zusätzliche Abfragen in der Datenbank zu tun haben würde, vermeiden, die ich durch das Hinzufügen der folgenden meiner FooBar Modell getan haben.

__original_bar = None 

def __init__(self, *args, **kwargs): 
    super(FooBar, self).__init__(*args, **kwargs) 
    self.__original_bar = self.bar 

def save(self, force_insert=False, Force_update=False, *args, **kwargs): 
     if self.bar != self.__original_bar: 
      super(FooBar, self).save(force_insert=True, force_update=False, *args, **kwargs) 
      self.__original_bar= self.bar 
     else: 
      super(FooBar, self).save(force_insert=False, force_update=True, *args, **kwargs) 

Wenn ich foo funktioniert alles einwandfrei aktualisiert werden, aber wenn ich die folgenden Fehler aktualisiere Leisten angezeigt wird:

Key ("FOOBAR_ID") = (2) ist bereits vorhanden.

Ich bin anscheinend völlig falsch was force_insert tut. Wie kann ich es erzwingen, einen neuen Datensatz im Speicher zu erstellen?

Antwort

1

Sie können Ihren Primärschlüssel auf None setzen und Django automatisch einen neuen Datensatz erstellen. Sie können mehr darüber in docs lesen.

def save(self, *args, **kwargs): 
    if self.bar != self.__original_bar: 
     self.FOOBAR_ID = None 
     self.__original_bar= self.bar 
    super(FooBar, self).save(*args, **kwargs) 
0

Sie sollten die ID entfernen, wenn der Balken verwendet wird. Versuchen Sie, es zu entfernen, bevor Sie die Daten an das Frontend senden.

Was ist passiert, dass Sie versuchen, eine neue Zeile in die Datenbank mit einem Primärschlüssel "Key (" FOOBAR_ID ") = (2)", die bereits existiert hinzuzufügen.

Verwandte Themen