首页 > 解决方案 > Django RF,验证反馈方法。(return Response vs raise ValidationError)

问题描述

当我在 Django 查询集中进行验证时,如果查询不满足某些参数,则以下代码成功执行并返回验证错误

if second_condition:
    raise ValidationError("1 error")
else:
    serializer.save()
            

同时,以下代码未能1 error 按预期给出响应。

if second_condition:
    return Response("1 error")
else:
    serializer.save()

为什么会这样?

注意:避免缩进格式

下面给出了没有格式化的完整代码

class CommentCreate(generics.CreateAPIView):
    serializer_class = CommentSerializer
    queryset = Comment.objects.all()
    permission_classes = [IsAuthenticated]

    def perform_create(self, serializer):
        request_user = self.request.user
        pk = self.kwargs.get('pk')
        product = get_object_or_404(Product, pk=pk)
        if Po.objects.filter(Q(user=request_user) & Q(item_id=pk) & Q(delivered=True)).exists():
            if Comment.objects.filter(Q(author=request_user) & Q(product=product)).exists():
                raise ValidationError("You have already commented")
            else:
                serializer.save(author=request_user, product=product)
        else:
            raise ValidationError("Purchase this item,prior to commenting")

标签: djangodjango-rest-framework

解决方案


这是因为异常会在堆栈中冒泡,直到异常被 DRF 捕获并按预期处理,而返回仅返回来自钩子perform_create 的值。您可以从主视图处理程序(无论您的 django 或 DRF 中的什么)返回类似响应的实例。更多关于这里的钩子,a 没有检查返回值的含义。


推荐阅读