Скрыть (очевидное) отношение от вложенного сериализатора в DRF
Django + rest framework. Кажется, что это должно быть частым и распространенным вопросом, но я не смог найти ничего подобного, поэтому здесь я спрашиваю:
У меня есть документ и его элементы:
class DocumentSerializer(ModelSerializer):
...
items = ItemsSerializer(many=True, required=False)
class Meta:
model = Document
exclude = ()
class ItemsSerializer(ModelSerializer):
...
class Meta:
model = DocumentItem
exclude = ('document', ) # hide the ForeignKey as it should be obvious by nesting
Ожидаемый результат для сериализованных данных JSON что-то вроде:
{
"id": 1, "date": "2021-01-01T00:00:00Z", "title": "Test doc",
"items": [
{"code": 43, quantity: 3},
{"code": 28, quantity: 15}
]
}
Должно быть достаточно очевидно, что поле "document" из ItemsSerializer должно быть производным от родительского сериализатора во время хранения. Само поле, конечно, является внешним ключом к Document.
Однако я не могу пройти мимо ValidationError({"document":["This field is required."]})
.
Если я говорю, что поле не является обязательным, то save()
вызывает AssertionError: The '.create()' method does not support writable nested fields by default.
Каков общепринятый способ обработки подобных отношений в сериализаторах?
Мое предложение:
- Проверьте, имеет ли смысл иметь документ без элементов.
- Всегда, когда у вас есть вложенный Serializer, метод @create и @update должны быть переопределены. Проверьте документацию .