/ / Siehe Objektänderungen in post_save im Django Rest-Framework - Django, Django-Rest-Framework

Siehe Objektänderungen in post_save im Django-Rest-Framework - django, django-rest-framework

Ich bin neugierig, ob es einen Weg gibt, um zu sehen, was hatfür ein Objekt geändert, nachdem es mit dem Django Rest Framework gespeichert wurde. Ich habe ein spezielles Verhalten, das ich überprüfen muss, ob ein Feld von seinem ursprünglichen Wert geändert wurde, mit dem ich gehofft hatte post_save auf generics.RetrieveUpdateDestroyAPIView.

Mein erster Gedanke war zu überprüfen pre_save aber es scheint so pre_save"s Objektargument hat bereits die Änderungen übernommen.

Antworten:

10 für die Antwort № 1

ALTE ANTWORT für Django Rest Framework Version 2.3.12:

Um zu prüfen, ob sich beim Update etwas geändert hat, müssen Sie die unveränderte Modellinstanz self.object mit der geänderten Modellinstanz serializer.object vergleichen.

Das Objektargument, das an die Methode pre_save übergeben wird, ist das serializer.object, das mit den neuen Änderungen noch nicht in der Datenbank gespeichert ist.

Die unveränderte Modellinstanz ist das self.object, das mit self.get_object_or_none () aus der Datenbank abgerufen wurde. Vergleichen Sie es mit dem Argument obj in der Methode pre_save.

def pre_save(self,obj):
unchanged_instance = self.object
changed_instance = obj
..... # comparison code

NEUE ANTWORT für Django Rest Framework 3.3:

pre_save und post_save sind nicht mehr gültig http://www.django-rest-framework.org/topics/3.0-announcement/#generic-views

Jetzt können Sie eine beliebige vor- oder nachgeschaltete Speicherlogik in der perform_update-Methode platzieren. Zum Beispiel:

def perform_update(self, serializer):
old_obj = self.get_object()
new_data_dict = serializer.validated_data
# pre save logic
if old_obj.name != new_data_dict["name"]
do_smething
.....
serializer.save()
# post save logic
......

1 für die Antwort № 2

Ich konnte dies mit Hilfe von tun model_utils FieldTracker. Sie können einen Tracker auf dem entsprechenden Modell installieren und dann in pre_save (durch post_save es ist zu spät) Sie können dies tun:

def pre_save(self, obj):
if hasattr(obj, "tracker"):
self.changed_fields = obj.tracker.changed()
else:
self.changed_fields = None

changed_fields wird so aussehen: {"is_public": False, "desc": None}