如何引发错误/返回{“ foo”:[“此字段为必填。”]}在Django REST中的响应

问题描述 投票:4回答:3

假设我有一个视图,我需要在调用serializer.save之前检查是否已给出字段,以确保我没有字典键错误:

class BarView(CreateAPIView):
    serializer_class = BarSerializer
    queryset = Bar.objects.all()
    def perform_create(self, serializer):
        if 'foo' not in self.request.data:
            raise ParseError('foo field required.')
        foo = get_object_or_404(Foo, pk=self.request.data['foo'])
        if foo.counter == 10:
            raise ParseError('foo limit reached.')
        return serializer.save(user=self.request.user, foo=foo)

而不是返回"foo field required.",我想返回的消息与Django REST返回的消息相同,例如{"foo":["This field is required."]}

有更好的方法吗?也许仅通过序列化程序验证foo字段?

更新:我忘记提及用户字段也是必需的。

Bar的模型是:

class Bar(models.Model):
    user = models.ForeignKey(User, db_index=True, editable=False)
    foo = models.ForeignKey(Foo, db_index=True)
python django django-rest-framework
3个回答
4
投票
是,

仅查看文档:Validation

[我假设字段fooBar模型的一部分,如果不是,请在fields中将其添加到Meta中):向BarSerializer添加验证:

class BarSerializer(serializers.ModelSerializer): def validate_foo(self, value): if not value: raise serializers.ValidationError("foo field required.") if Foo.objects.filter(pk=value, counter__gte=10).exists(): raise serializers.ValidationError("foo limit reached.") return value class Meta: model = Bar

然后通过扩展此内容来创建您的视图:

from rest_framework.exceptions import ValidationError class MyCreateAPIView(CreateAPIView): def post(self, request, *args, **kwargs): try: return super(BarView, self).post(request, *args, **kwargs) except ValidationError as e: return Response(e.detail, , status=status.HTTP_400_BAD_REQUEST) def create(self,request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) try: self.perform_create(serializer) except DjangoValidationError as e: raise ValidationError(e.messages) self.perform_create(serializer) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) def perform_create(serializer): # do your stuff serializer.save()


1
投票

是,执行此操作的最佳方法是使用foo类中的extra_kwargs选项,在序列化程序中创建extra_kwargs字段。


0
投票
您可以使用用户定义的消息返回class BarView(CreateAPIView): serializer_class = BarSerializer queryset = Bar.objects.all() def perform_create(self, serializer): return serializer.save(user=self.request.user, foo=serializer.foo_object)
© www.soinside.com 2019 - 2024. All rights reserved.