MyModel.objects.update_or_create () - Boolean, ob Daten aktualisiert wurden oder nicht?

8

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:

  1. obj wurde erstellt. Kein Problem, ich habe die boolsche Variable created
  2. obj wurde nicht erstellt, es wurde aktualisiert. Zum Beispiel war der vorherige Name "Machuca".
  3. 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.

    
guettli 17.07.2017, 14:34
quelle

3 Antworten

6

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.

%Vor%     
ARJMP 27.07.2017, 03:29
quelle
2

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:

%Vor%

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.

    
bakkal 24.07.2017 08:48
quelle
0

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:

%Vor%

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.

    
valignatev 26.07.2017 15:41
quelle

Tags und Links