/ / Pozrite si zmeny objektov v post_save v frameworku django rest - django, django-rest-framework

Pozrite si zmeny objektov v post_save v django odpočinkovom rámci - django, django-rest-framework

Som zvedavý, či existuje spôsob, ako zistiť, čo mápo uložení pomocou objektu Django Rest Framework. Mám nejaké zvláštne správanie, musím skontrolovať, či sa pole zmenilo z pôvodnej hodnoty, ktorú som dúfal, že zvládnem pomocou post_save na generics.RetrieveUpdateDestroyAPIView.

Moja prvá myšlienka bola kontrola pomocou pre_save ale zdá sa, že pre_saveV argumente objektu sa naň už vzťahujú zmeny.

odpovede:

10 pre odpoveď č. 1

STARÁ ODPOVEĎ pre rámec odpočinku django verzie 2.3.12:

Ak chcete skontrolovať, či sa pri aktualizácii niečo nezmenilo, budete musieť porovnať nezmenenú inštanciu modelu, ktorá je self.object, so zmenenou inštanciou modelu, ktorá je serializer.object.

Argumentom objektu, ktorý sa odovzdáva metóde pre_save, je serializer.object, ktorý ešte nie je uložený v databáze s novými zmenami.

Nezmenená inštancia modelu je self.object, ktorý bol vyzdvihnutý z databázy pomocou self.get_object_or_none (). Porovnajte ho s argumentom obj v metóde pre_save.

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

NOVÁ ODPOVEĎ pre rámec odpočinku django 3.3:

pre_save a post_save už nie sú platné http://www.django-rest-framework.org/topics/3.0-announcement/#generic-views

Teraz môžete umiestniť ľubovoľnú logiku pred uložením alebo po uložení v metóde perform_update. Napríklad:

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 pre odpoveď č. 2

Podarilo sa mi to s pomocou od model_utils FieldTracker, Môžete nainštalovať sledovač na príslušný model a potom v systéme Windows pre_save (o post_save je príliš neskoro) môžete to urobiť:

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

changed_fields bude vyzerať takto: {"is_public": False, "desc": None}