mik*_*kec 4 django django-rest-framework
我很好奇是否有一种方法可以在使用Django Rest Framework保存对象后查看对象的更改.我有一些特殊的行为,我需要检查一个字段是否已从我希望使用post_saveon 处理的原始值更改generics.RetrieveUpdateDestroyAPIView.
我的第一个想法是检查使用,pre_save但似乎pre_save对象参数已经应用了它的更改.
zap*_*.10 12
django rest framework version 2.3.12的OLD ANSWER:
要检查更新时是否有任何更改,您必须将未更改的模型实例(即self.object)与已更改的模型实例(serializer.object)进行比较.
传递给pre_save方法的object参数是serializer.object,它尚未保存在数据库中并带有新的更改.
未更改的模型实例是self.object,它使用self.get_object_or_none()从数据库中获取.将它与pre_save方法中的obj参数进行比较.
def pre_save(self,obj):
unchanged_instance = self.object
changed_instance = obj
..... # comparison code
Run Code Online (Sandbox Code Playgroud)
django休息框架3.3的新答案:
pre_save和post_save不再有效 http://www.django-rest-framework.org/topics/3.0-announcement/#generic-views
现在,您可以在perform_update方法中放置任何预保存或后保存逻辑.例如:
def perform_update(self, serializer):
# NOTE: serializer.instance gets updated after calling save
# if you want to use the old_obj after saving the serializer you should
# use self.get_object() to get the old instance.
# other wise serializer.instance would do fine
old_obj = self.get_object()
new_data_dict = serializer.validated_data
# pre save logic
if old_obj.name != new_data_dict['name']:
do_something
.....
new_obj = serializer.save()
# post save logic
......
Run Code Online (Sandbox Code Playgroud)