Django Rest Framework DELETE在正文中不返回任何内容

And*_*ara 9 python django django-rest-framework redux

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

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

有没有办法强制 DRF 添加有关响应正文中已删除内容的信息?

谢谢!

And*_*ara 10

用可操作的代码补充@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)
Run Code Online (Sandbox Code Playgroud)

需要注意的几点:

  • 返回 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
Run Code Online (Sandbox Code Playgroud)


Lin*_*via 7

肯定的事。在您看来,您必须覆盖destroy. 默认实现 - 在撰写此答案时 - 是:

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