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 на этих данных.

Вернуться на верх