Я разверну ответ Konrad. Мне нравится он, потому что ее довольно явное, и также Вы называете проверку на других полях, когда мы используем их. Таким образом, это более безопасно, вероятно, будет избыточно (некоторые проверки назовут дважды)
Первая вещь отметить, то, что, если мы реализуем как это, когда мы выполняем run_validator, только набор проверок в переменной блоков проверки допустимости появится. Таким образом, если мы проверим поле, например, с validate_ методами, то оно не будет выполнено.
кроме того, я имею, делают это наследуемым, таким образом, мы можем повторно реализовать функцию проверки и rehuse код.
validators.py
from rest_framework.serializers import ValidationError
class OtherFieldValidator:
#### This part is the same for all validators ####
def __init__(self, other_field):
self.other_field = other_field # name of parameter
def set_context(self, serializer_field):
self.serializer_field = serializer_field # name of field where validator is defined
def make_validation(self,field, other_field):
pass
def __call__(self, value):
field = value
serializer = self.serializer_field.parent # serializer of model
raw_other_field = serializer.initial_data[self.other_field] # data del otro campo
try:
other_field = serializer.fields[self.other_field].run_validation(raw_other_field)
except ValidationError:
return # if date_start is incorrect we will omit validating range
#### Here is the only part that changes ####
self.make_validation(field,other_field)
class EndDateValidator(OtherFieldValidator):
def make_validation(self,field, other_field):
date_end = field
date_start = other_field
if date_start and date_end and date_end < date_start:
raise ValidationError('date cannot be')
, Таким образом, сериализатор будет похож на это: serializers.py
# Other imports
from .validators import EndDateValidator
def myfoo(value):
raise ValidationError("start date error")
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = '__all__'
extra_kwargs = {
'date_end': {'validators': [EndDateValidator('date_start')]},
'date_start': {'validators': [myfoo]},
}