【发布时间】:2021-12-13 18:54:26
【问题描述】:
假设我有以下序列化程序:
class AnswerSerializer(ModelSerializer):
answer_text=CharField()
def validate_answer_text(self, value):
...
return value
def validate(self, value):
...
return value
class QuestionSerializer(ModelSerializer):
question_text=CharField()
answer=AnswerSerializer(many=True, read_only=False)
def validate_question_text(self, value):
...
return value
def validate(self, value):
...
return value
如果AnswerSerializer 中的validate_answer_text 或validate 或QuestionSerializer 中的validate_question_text 引发ValidationError,则QuestionSerializer 的validate 将不会运行。因此,我无法解释 POST 数据的所有问题。
有没有办法运行序列化器的validate 函数,即使它的字段验证器或子序列化器验证失败,然后合并所有错误?
我尝试了following,但没有成功使其正常工作。它确实运行验证函数和其他验证器,但你不能嵌套 AllErrorSerializer,更重要的是,当你没有错误时它不起作用:你不能保存实例,因为你有检查 serializer.data。
编辑
由于 Willem Van Onsem 的回答,我最终得到了以下解决方案:
#serializers.py
class AnswerSerializer(ModelSerializer):
answer_text=CharField()
class Meta:
model=Answer
...
def validate_answer_text(self, value):
...
return value
def validate(self, value):
...
return value
class QuestionSerializer(ModelSerializer):
question_text=CharField()
answer=AnswerSerializer(many=True, read_only=False)
class Meta:
model=Question
...
def validate_question_text(self, value):
...
return value
class BasicAnswerSerializer(ModelSerializer):
answer_text=CharField()
class Meta:
model=Answer
...
class BusinessRuleValidator(ModelSerializer):
question_text=CharField()
answer=BasicAnswerSerializer(many=True, read_only=False)
class Meta:
model=Question
...
def validate(self, value):
...
return value
#views.py
class QuestionViewSet(ModelViewSet):
...
def create(self, request):
validator = BusinessRuleValidator(data=request.data)
validator.is_valid()
serializer = QuestionSerializer(data=request.data)
serializer.is_valid()
if (len(validator.errors) or len(serializer.errors)):
return Response(merge(validators.errors, serializer.errors), status=404)
serializer.create()
return Response('created', status=201)
【问题讨论】:
-
如果其中一个字段验证器引发异常,则无法构造
validated_data字典以运行validate,因为这要求所有字段都单独有效,这就是为什么它不运行validate方法。
标签: django django-rest-framework django-serializer validationerror