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)
您可以通过权限解决它:
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那样验证对象权限检查,因为权限应该只检查权限内容,并且不返回任何与验证相关的消息.
希望有所帮助;)
对于像我这样从 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)
我不会引发 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)
| 归档时间: |
|
| 查看次数: |
3503 次 |
| 最近记录: |