请参阅django rest框架中post_save中的对象更改

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)

  • 这似乎不起作用.``self.object``和``obj``是相同的副本.我发布了一个新值,``self.object``和``obj``都显示相同的值,不应该是这样,为什么? (3认同)