Django DRF validate() не выполняется при множественном наследовании сериализаторов

Я пытаюсь добиться следующего поведения:

class Serializer1(serializers.Serializer):
    field1 = serializers.CharField()

class Serializer2(serializers.Serializer):
    field2 = serializers.CharField()
    field3 = serializers.IntegerField()
    field4 = serializers.IntegerField()
   
    def validate(self, data):
        if data['field3'] > data['field4']:
            raise serializers.ValidationError('field3 must be < field4')

class Serializer3(Serializer1, Serializer2):
   ...

serializer = Serializer3(data=data, many=True)
serializer.is_valid()
serializer.errors

EXPECTED:
>> [{
'field1': [ErrorDetail(string='field can't be empty', code='blank')],
'field2': [ErrorDetail(string='field can't be empty', code='blank')], 
'non-field-errors': [ErrorDetail(string='field3 must be < field4', code='invalid')]
}]

REAL:
>> [{
'field1': [ErrorDetail(string='field can't be empty', code='blank')],
'field2': [ErrorDetail(string='field can't be empty', code='blank')], 
}]

Комментарии: Интересно, почему метод validate() Serializer2 не выполняется, и как добиться ожидаемого поведения? Что я упускаю? Я пытался добиться ожидаемой логики, реализуя валидатор на основе класса Custom следующим образом:

class IsBigger:
    requires_context=True
    def __call__(self, serializer_field):
       ### serializer_field seems useless here since this object doen't give me access to fields
       ### see what does dir(serializer_field) do

       print(dir(serializer_field))

       raise serializers.ValidationError('Test Error')

class Serializer2(serializers.Serializer):
   field2 = serializers.CharField()
   field3 = serializers.IntegerField(validators=[IsBigger()])
   field4 = serializers.IntegerField()
>> 
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']

Так что это также тормозит мою гипотезу. Есть ли идеи, как заставить это работать наиболее подходящим способом?

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