Django Rest Framework DELETE在主体中不返回任何内容

时间:2018-10-06 20:52:31

标签: python django redux django-rest-framework

我正在使用Django Rest Framework,并且正在执行DELETE请求。与POST,PUT,PATCH(它们都返回对象在创建/修改后的状态)相反,delete不会在主体中返回任何内容(仅返回204代码)。

在尝试将响应与其原始请求联系起来时,具有此信息将很有帮助。特别是https://github.com/agraboso/redux-api-middleware在告诉我成功和错误方面做得很差)

是否有一种方法可以强制DRF添加有关响应正文中已删除内容的信息?

谢谢!

2 个答案:

答案 0 :(得分:2)

当然。在您看来,您将不得不覆盖destroy。在编写此答案时,默认实现为:

def destroy(self, request, *args, **kwargs):
    instance = self.get_object()
    self.perform_destroy(instance)
    return Response(status=status.HTTP_204_NO_CONTENT)

答案 1 :(得分:1)

用可行的代码补充@Linovia的其他完整答案。

在ViewSet中,添加以下内容会有所帮助

class WhateverYourModelIsViewSet(viewsets.ModelViewSet):
    def destroy(self, *args, **kwargs):
        serializer = self.get_serializer(self.get_object())
        super().destroy(*args, **kwargs)
        return response.Response(serializer.data, status=status.HTTP_200_OK)

几件事要注意:

  • 返回204代码实际上将删除数据,您必须返回其他内容
  • 在调用destroy
  • 之前,您需要从序列化程序中提取数据。

编辑:

自从我第一次发布答案以来,我发现自己经常需要执行上述操作。更具扩展性的解决方案:

class DestroyWithPayloadMixin(object):
     def destroy(self, *args, **kwargs):
         serializer = self.get_serializer(self.get_object())
         super().destroy(*args, **kwargs)
         return response.Response(serializer.data, status=status.HTTP_200_OK)

class WhateverYourModelIsViewSet(DestroyWithPayloadMixin, viewsets.ModelViewSet):
   # Your implementation 
   pass