django 模型验证的DRF返回错误

flseospp  于 2023-05-01  发布在  Go
关注(0)|答案(1)|浏览(149)

我有模型和序列化器。从序列化器返回的错误很有帮助,因为我可以将它们作为响应发送给API,用户可以纠正无效数据。
然而,来自模型的错误对我来说是无用的。他们返回500错误,他们没有一个身体,我可以发送回用户。
我是否应该更多地覆盖验证方法,以给予一些可用的错误,或者有一种方法可以实现?
模型

class School(models.Model):

    SUBJECT = (
       ('Math', 'Mathematic'),
       ('Eng', 'English'),
       ('Cesolved', 'Chemistry'),
   )

    name = models.CharField(blank=False, max_length=50)
    subject = models.CharField(choices=SUBJECT, max_length=15, blank=False)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return str(f'{self.name} is {self.subject}')

序列化器

class SchoolSerializer(serializers.ModelSerializer):
    subject = serializers.ChoiceField(choices=School.SUBJECT)

    def validate(self, data):
        name = data["name"]
        if (5 > len(name)):
            raise serializers.ValidationError({"IError": "Invalid name"})
 
        return data

    class Meta:
        model = School
        fields = "__all__"

观点

class SchoolViewSet(viewsets.ModelViewSet):

    queryset = School.objects.all()
    serializer_class = SchoolSerializer

    def create(self, request):
        serializer = SchoolSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

例如,如果name小于5,我会返回一个有用的错误,但是当name太长时,我让django模型返回错误,我得到的唯一结果是500响应和终端中的print语句

django.db.utils.DataError: value too long for type character varying(50)
lsmepo6l

lsmepo6l1#

通常,DRf会处理一些基本的东西,比如必需/非必需的字段检查,但是如果模型/数据库返回的错误没有得到处理,我建议在序列化器中添加自定义字段级验证,比如validate_name,如果提供的参数违反了预期的行为,就会引发验证错误。
你可以在这里看到详细的例子 www.example.com

相关问题