我有模型和序列化器。从序列化器返回的错误很有帮助,因为我可以将它们作为响应发送给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)
1条答案
按热度按时间lsmepo6l1#
通常,DRf会处理一些基本的东西,比如必需/非必需的字段检查,但是如果模型/数据库返回的错误没有得到处理,我建议在序列化器中添加自定义字段级验证,比如validate_name,如果提供的参数违反了预期的行为,就会引发验证错误。
你可以在这里看到详细的例子 www.example.com