Django DRF - вложенный сериализатор (уровень>2) не отображается в ответе

У нас есть следующая структура (library->books->pages)

первый сериализатор

   class Library(serializers.ModelSerializer):
         books = BookSerializer(many=True)

         class Meta:
            model = Library
            fields = '__all__'

         @transaction.atomic
         def create(self, validated_data):
             # create logic here

второй сериализатор

   class BookSerializer(serializers.ModelSerializer):
         results = PageSerializer(many=True, required=False)

         class Meta:
            model = Book
            fields = '__all__'

у нас есть конечная точка library/, куда мы отправляем полезную нагрузку следующего формата

{
    "ref": "43a0c953-1380-43dd-a844-bbb97a325586",
    "books": [
        {
            "name": "The Jungle Book",
            "author": "Rudyard Kipling",
            "pages": [
                {
                    "content": "...",
                    "pagenumber": 22
                }
            ]
        }
    ]
}

все объекты созданы в базе данных, но ответ не содержит pages ключа. Это выглядит следующим образом

{
    "id": 27,
    "ref": "43a0c953-1380-43dd-a844-bbb97a325586",
    "books": [
        {
            "id": 34,
            "name": "The Jungle Book",
            "author": "Rudyard Kipling"
        }
    ]
}
Атрибут

depth, похоже, не работает. Что мне нужно сделать, чтобы pages появился в ответе?

Мы можем добиться желаемого поведения, используя depth в class Meta из BookSerializer.

class BookSerializer(serializers.ModelSerializer):

...

   class Meta:
     ...
     depth = 3

Скопировано из Документации

Опция depth должна быть установлена на целочисленное значение, которое указывает глубину отношений, которые должны быть пройдены перед возвратом к плоскому представлению.

Другим способом добиться такого поведения было бы использование serializer.SerializerMethodField для получения pages сериализатора книги.

class BookSerializer(serializers.ModelSerializer):
  pages = serializers.SerializerMethodField()

  def get_pages(self, obj):
     return PageSerializer(obj.page_set.all(), many=True,).data

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