58
задан 23 May 2017 в 14:46

1 ответ

Я разверну ответ 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]},                       
         }                                                                
0
ответ дан 1 November 2019 в 14:15

Другие вопросы по тегам:

Похожие вопросы: