DRF: функция validate_empty_values() вызывается, когда она не пуста

Я создал подкласс ChoiceField, чтобы добавить пользовательский код для установки значения по умолчанию. На данный момент я скопировал метод validate_empty_values() в свой новый класс, не изменяя его вообще - я просто хочу понять, как он работает.

Вот этот метод (скопированный прямо из класса Field в /rest_framework/fields.py):

    def validate_empty_values(self, data):
        """
        Validate empty values, and either:

        * Raise `ValidationError`, indicating invalid data.
        * Raise `SkipField`, indicating that the field should be ignored.
        * Return (True, data), indicating an empty value that should be
          returned without any further validation being applied.
        * Return (False, data), indicating a non-empty value, that should
          have validation applied as normal.
        """
        if self.read_only:
            return (True, self.get_default())

        if data is empty:
            if getattr(self.root, 'partial', False):
                raise SkipField()
            if self.required:
                self.fail('required')
            return (True, self.get_default())

        if data is None:
            if not self.allow_null:
                self.fail('null')
            # Nullable `source='*'` fields should not be skipped when its named
            # field is given a null value. This is because `source='*'` means
            # the field is passed the entire object, which is not null.
            elif self.source == '*':
                return (False, None)
            return (True, None)

        return (False, data)

Я выполнил PATCH (мы используем PATCH для всех обновлений на нашем сайте) четыре раза со следующими значениями, чтобы посмотреть, как будет вести себя вышеупомянутый метод:

{}


{
    "sprint_status": null
}


{
    "sprint_status": ""
}


{
    "sprint_status": "xxx"
}

Значение "xxx" не является допустимым выбором, но я просто проверял, пропускает ли он вызов validate_empty_values() в этом случае. Но она была вызвана во всех четырех случаях.

Вот скриншот, показывающий это в отладке. Вы можете видеть, что значение "data" равно "xxx".

screenshot

Правильное ли это поведение? Судя по первым двум строкам кода:

        if self.read_only:
            return (True, self.get_default())

... похоже, метод не ожидает получить фактическое значение в "data", иначе ему может понадобиться вернуть это значение, даже если поле доступно только для чтения.

Кроме того, кажется, что этот комментарий * Raise `ValidationError`, indicating invalid data. неверен. Я не вижу, где в этом методе возникает ValidationError.

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