Скрыть (очевидное) отношение от вложенного сериализатора в 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.

Каков общепринятый способ обработки подобных отношений в сериализаторах?

Мое предложение:

  1. Проверьте, имеет ли смысл иметь документ без элементов.
  2. Всегда, когда у вас есть вложенный Serializer, метод @create и @update должны быть переопределены. Проверьте документацию
  3. .
Вернуться на верх