我如何覆盖django rest框架中的perform_destroy方法?

Kam*_*i81 8 python django django-rest-framework

如果数据库中不存在对象,则DRF当前具有抛出404的功能.例如

Request: /delete/1234
Response: 204 (success)
Request 2: /delete/1234
Response: 404 (not found)
Run Code Online (Sandbox Code Playgroud)

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

Request: /delete/1234
Response: 204 (success)
Request 2: /delete/1234
Response: 204 (success)
Run Code Online (Sandbox Code Playgroud)

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

Tev*_*K O 17

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

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

from rest_framework import status,viewsets
from rest_framework.response import Response
from django.http import Http404

 class ExampleDestoryViewset(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)
Run Code Online (Sandbox Code Playgroud)


See*_*u S 5

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

class ExampleDestoryViewset(viewset.ModelViewSet):
    queryset = # queryset
    serializer_class = # serializer class

    def get_queryset(self):
        # write custom code

    def perform_destroy(self, instance): 
        # write custom code
Run Code Online (Sandbox Code Playgroud)