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']
Так что это также тормозит мою гипотезу. Есть ли идеи, как заставить это работать наиболее подходящим способом?