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_save
V argumente objektu sa naň už vzťahujú zmeny.
odpovede:
10 pre odpoveď č. 1STARÁ 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}