【问题标题】:How would I override the perform_destroy method in django rest framework?我将如何覆盖 django rest 框架中的 perform_destroy 方法?
【发布时间】:2015-09-10 23:56:43
【问题描述】:

DRF 当前具有在数据库中不存在对象时抛出 404 的功能。例如

Request: /delete/1234
Response: 204 (success)
Request 2: /delete/1234
Response: 404 (not found)

这个逻辑对我的移动应用程序来说非常有问题,我想更改它,以便我覆盖 404-not-found 功能。换句话说,我希望我的请求是幂等的。例如:

Request: /delete/1234
Response: 204 (success)
Request 2: /delete/1234
Response: 204 (success)

我一直在查看文档,但我不确定如何覆盖 get_object_or_404 功能。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    我相信,如果没有要删除的对象,理想情况下它应该像 DRF 一样返回 404。

    根据您的要求,以下代码可以解决问题:

    from rest_framework import status,viewsets
    from rest_framework.response import Response
    from django.http import Http404
    
     class ExampleDestroyViewset(viewset.ModelViewSet):
        def destroy(self, request, *args, **kwargs):
            try:
                instance = self.get_object()
                self.perform_destroy(instance)
            except Http404:
                pass
            return Response(status=status.HTTP_204_NO_CONTENT)
    

    【讨论】:

      【解决方案2】:

      要实现自定义功能,您需要覆盖视图集中的get_object() 方法。点击链接get_objectperform_destroy

      class ExampleDestroyViewset(viewset.ModelViewSet):
          queryset = # queryset
          serializer_class = # serializer class
          
          def get_queryset(self):
              # write custom code
      
          def perform_destroy(self, instance): 
              # write custom code
      

      【讨论】:

        猜你喜欢
        • 2018-08-02
        • 2022-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-23
        • 2016-05-27
        • 2019-05-23
        • 2013-12-23
        相关资源
        最近更新 更多