Проверка выполняется только при десериализации. Согласно документации :
Сериализаторы также обеспечивают десериализацию, позволяя преобразовывать проанализированные данные обратно в сложные типы после первой проверки входящих данных.
Это имеет смысл ( edit : таким образом, Django Rest Framework, по-видимому, истолковывается). Поскольку роль Serializer не в том, чтобы убедиться, что ваши сложные данные, такие как наборы запросов и экземпляры модели (например, ваш Book
экземпляр), которые вы собираетесь сериализовать, интерпретируются «законно», поэтому они также не не проверять при сериализации.
Поэтому, если вы сохраните экземпляр как invalid_book.save()
, Django выдаст ошибку из-за пропущенного поля.
Редактировать
После комментария о том, чтобы быть «точкой зрения» и, следовательно, быть осуждаемым, я хочу подчеркнуть и пояснить, что, похоже, именно таким образом истолковывается Django Rest Framework (DRF). После более глубокого изучения SO я связываю этот ответ в службу поддержки.
Также, если вы читаете документацию по DRF, подразумевается, что сериализация и проверка - это две разные концепции.
Кроме того, анализ serializers.py
проясняет, что проверка запускается только при вызове is_valid()
и проверка выполняется только на предоставленной data
флаг. На самом деле, он даже не может быть запущен, когда предоставляется только экземпляр:
def __init__(self, instance=None, data=empty, **kwargs):
self.instance = instance
if data is not empty:
self.initial_data = data
self.partial = kwargs.pop('partial', False)
self._context = kwargs.pop('context', {})
kwargs.pop('many', None)
super().__init__(**kwargs)
...
def is_valid(self, raise_exception=False):
assert hasattr(self, 'initial_data'), (
'Cannot call `.is_valid()` as no `data=` keyword argument was '
'passed when instantiating the serializer instance.'
)
if not hasattr(self, '_validated_data'):
try:
self._validated_data = self.run_validation(self.initial_data)
except ValidationError as exc:
self._validated_data = {}
self._errors = exc.detail
else:
self._errors = {}
if self._errors and raise_exception:
raise ValidationError(self.errors)
return not bool(self._errors)