【问题标题】:Django Rest Framework DELETE returns no content in the bodyDjango Rest Framework DELETE 在正文中不返回任何内容
【发布时间】:2018-10-06 20:52:30
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: python django redux django-rest-framework


    【解决方案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
    

    【讨论】:

    • 当 ModelSerializer 上的字段为 serializers.PrimaryKeyRelatedField(many=True) 时,其值在 Response 上为空。它适用于PrimaryKeyRelatedField(many=False) 和普通模型字段等字段。我应该在代码中添加什么来修复它?
    【解决方案2】:

    当然。在您看来,您必须覆盖destroy。默认实现 - 在撰写此答案时 - 是:

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

    【讨论】:

      猜你喜欢
      • 2020-07-11
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 2013-04-09
      • 2021-10-08
      • 1970-01-01
      相关资源
      最近更新 更多