Django DRF - nested serializer (level>2) does not show up in the response

We have the follwing structure (library->books->pages)

the first serializer

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

         class Meta:
            model = Library
            fields = '__all__'

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

the second serializer

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

         class Meta:
            model = Book
            fields = '__all__'

we have an endpoint library/, where we post the payload of the following format

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

all the objects are created in the database, but the response does not contain pages key. It looks like this

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

depth attribute does not seem to work. What do I have to do to make pages appear in the responce?

We can achieve the desired behavior using depth in the class Meta of the BookSerializer.

class BookSerializer(serializers.ModelSerializer):

...

   class Meta:
     ...
     depth = 3

Copied from documentation

The depth option should be set to an integer value that indicates the depth of relationships that should be traversed before reverting to a flat representation.

Another way to get this behavior would be to use serializer.SerializerMethodField for getting the pages of the book serializer.

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

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

  ...
Back to Top