AFAIK Django bietet keine allgemeine Möglichkeit, um zu sehen, ob Daten von update_or_create ()
Der boolesche created
sagt mir, dass eine Zeile erstellt wurde. Aber wie kann ich wissen, ob Daten geändert wurden (SQL UPDATE, welche Daten geändert haben)
Beispiel:
%Vor%Es gibt drei Fälle:
obj
wurde erstellt. Kein Problem, ich habe die boolsche Variable created
obj
wurde nicht erstellt, es wurde aktualisiert. Zum Beispiel war der vorherige Name "Machuca". obj
wurde nicht erstellt und nicht aktualisiert. Zum Beispiel war der vorherige Name bereits "Doktor Schiwago". Ich kann im Moment nicht zwischen case2 und case3 unterscheiden.
Ich fühle mich inspiriert von @bakkal und habe eine Mixinklasse geschrieben, die Sie auf eine benutzerdefinierte Manager-Klasse anwenden können. Weisen Sie dann diesen benutzerdefinierten Manager der Klasse MyModel
zu. Dies ändert das Format des zurückgegebenen Tupels in (obj, created, updated)
. In der Schleife über den Werten in defaults.items()
überprüfe ich, ob sich irgendwelche der neuen Werte von den alten Werten unterscheiden.
Wenn man bedenkt, wie diese Schnittstelle implementiert ist, gibt es keine Möglichkeit festzustellen, ob das Objekt aktualisiert wurde oder nicht, wenn es erstellt wurde. Weil in diesem Fall immer save()
aufgerufen wird.
So wird update_or_create()
derzeit implementiert:
Ref. Ссылка
Wie Sie sehen können, wenn das Objekt nicht erstellt wurde, kann die Art der Implementierung nicht feststellen, ob es aktualisiert wurde oder nicht.
Sie können jedoch manuell überprüfen, ob sich Ihre Such- / Aktualisierungswerte von denen des vorhandenen Objekts im DB unterscheiden, bevor Sie save()
kalibrieren, und dann ein updated
-Flag setzen.
Ich verwende derzeit einen gemischten Ansatz für die Behandlung dieser Art von Aufgaben:
Ich habe last_edited
oder last_modified
Feld auf Modell ohne auto_now=True
.
Anstelle von auto_now
verwende ich django-dirtyfields und innerhalb von save
method mache ich so etwas:
Wenn Ihnen die Unordnung in save
-Methode nicht gefällt, können Sie pre_save
signal verwenden und last_modified
dort aktualisieren, basierend auf schmutzigen Feldern.
Nach dem Aufruf von update_or_create
können Sie sich ziemlich sicher auf das Feld last_modified
verlassen, um zu überprüfen, ob das Modell wirklich modifiziert wurde.
dirtyfield's api ist ziemlich einfach, du kannst damit spielen ohne zu viel Setup-Schmerz.
Tags und Links django django-models