Django rest framweork: объединить ValidationError от множественной валидации
Допустим, у меня есть следующие сериализаторы:
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
Если validate_answer_text
или validate
в AnswerSerializer
или validate_question_text
в QuestionSerializer
вызовет ValidationError
, validate
из QuestionSerializer
не будет запущен. Таким образом, я не могу объяснить всю проблему POST datas.
Есть ли способ запустить функцию validate
сериализатора, даже если валидатор одного из его полей или валидация дочерних сериализаторов не прошла, а затем объединить все ошибки?
Я попробовал following, но не смог заставить его работать должным образом. Он выполняет и функцию validate, и другие валидаторы, но вы не можете вложить AllErrorSerializer и, что более важно, он не работает, когда у вас нет ошибки: вы не можете сохранить экземпляр, потому что у вас есть inspect serializer.data.
Не имеет смысла запускать validate, если одно из полей недействительно. Django сначала проверит отдельные поля, а затем создаст словарь, содержащий проверенные данные, и запустит метод .validate(…)
с этими проверенными данными.
Но поскольку данные (по крайней мере) одного из полей недействительны, это означает, что мы не можем построить такой словарь при действительных данных, и поэтому предусловие метода .validate(…)
уже не выполняется. Чтобы исправить это, сначала эти поля должны быть доступны.
Например, ваш сериализатор может иметь поле boolean. Если в это поле передается, например, значение tralse
, а поле должно быть true
или false
, то какое значение должно быть передано для этого поля? Произвольное булево значение, строка tralse
?
Другой валидатор поля может просто потребовать, чтобы поле было частью запроса. Это означает, что если валидатор поля не сработает, то значения для этого поля просто не будет. Поэтому единственной разумной вещью может быть исключение его из словаря validated_data
, но метод validate
принимает в качестве предварительного условия, что все требуемые поля находятся в словаре validated_data
. Таким образом, снова нет смысла запускать validate
на этих данных.