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".
Правильное ли это поведение? Судя по первым двум строкам кода:
if self.read_only:
return (True, self.get_default())
... похоже, метод не ожидает получить фактическое значение в "data", иначе ему может понадобиться вернуть это значение, даже если поле доступно только для чтения.
Кроме того, кажется, что этот комментарий * Raise `ValidationError`, indicating invalid data.
неверен. Я не вижу, где в этом методе возникает ValidationError.