Django REST框架:在删除之前验证

Nei*_*eil 10 django validation django-rest-framework

我想在删除对象之前运行验证,以防止在某些情况下删除并作为验证错误返回.我怎么做?我目前看来不正确:

class CallDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = XCall.objects.all()
    serializer_class = CallSerializer
    ...

    def pre_delete(self, obj):
        if obj.survey:
            raise serializers.ValidationError("Too late to delete")
Run Code Online (Sandbox Code Playgroud)

ava*_*123 6

您可以通过权限解决它:

from rest_framework import permissions

class IsSurvey(permissions.BasePermission):


    def has_object_permission(self, request, view, obj):

        if request.method == 'DELETE' and obj.survey:
            return False


        return True
Run Code Online (Sandbox Code Playgroud)

然后添加到您的视图的 permission_classes

from permissions import IsSurvey

class MyViewSet(viewsets.ModelViewSet):
    permission_classes = (IsSurvey, )
Run Code Online (Sandbox Code Playgroud)


小智 6

我发现的解决方案是覆盖api上的destroy方法.

class CallDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = XCall.objects.all()
    serializer_class = CallSerializer
    ...

    def destroy(self, request, *args, **kwargs):
        obj = self.get_object()
        if obj.survey:
            return Response(data={'message': "Too late to delete"},
                            status=status.HTTP_400_BAD_REQUEST)
        self.perform_destroy(obj)
        return Response(status=status.HTTP_204_NO_CONTENT)
Run Code Online (Sandbox Code Playgroud)

对于我来说,验证destroy方法更有意义,而不是像对象avances123那样验证对象权限检查,因为权限应该只检查权限内容,并且不返回任何与验证相关的消息.

希望有所帮助;)


Oli*_*Crt 5

对于像我这样从 V3 开始在这里登陆的人...... :)
你现在可以使用perform_destroy

def perform_destroy(self, instance):
    if not can_delete(instance):
        raise ValidationError("You are not allowed to perform this action.")
    instance.delete()
Run Code Online (Sandbox Code Playgroud)


Nei*_*eil 2

我不会引发 a ValidationError,而只会引发ParseError或另一个符合错误描述的自定义错误:

from rest_framework import exceptions
def pre_delete(self, obj):
        if obj.survey:
            raise exceptions.ParseError("Too late to delete")
Run Code Online (Sandbox Code Playgroud)