0
0
DjangoHow-ToBeginner · 4 min read

How to Use Nested Serializer in DRF in Django

In Django REST Framework, use nested serializers by defining a serializer inside another serializer to represent related models. This allows you to include detailed data of related objects in API responses easily.
📐

Syntax

To use a nested serializer, define a serializer for the related model and then include it as a field inside the main serializer. Use many=True if the relation is one-to-many or many-to-many.

Example parts:

  • RelatedSerializer: Serializer for the related model.
  • MainSerializer: Serializer for the main model that includes RelatedSerializer as a field.
  • many=True: Indicates multiple related objects.
python
class RelatedSerializer(serializers.ModelSerializer):
    class Meta:
        model = RelatedModel
        fields = ['id', 'name']

class MainSerializer(serializers.ModelSerializer):
    related_objects = RelatedSerializer(many=True, read_only=True)

    class Meta:
        model = MainModel
        fields = ['id', 'title', 'related_objects']
💻

Example

This example shows two models: Author and Book. Each author can have many books. We create a nested serializer to show all books inside the author data.

python
from rest_framework import serializers
from django.db import models

# Models
def Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, related_name='books', on_delete=models.CASCADE)

# Serializers
class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['id', 'title']

class AuthorSerializer(serializers.ModelSerializer):
    books = BookSerializer(many=True, read_only=True)

    class Meta:
        model = Author
        fields = ['id', 'name', 'books']

# Usage example (in a view or shell)
author = Author.objects.create(name='Jane Doe')
Book.objects.create(title='Book One', author=author)
Book.objects.create(title='Book Two', author=author)
serializer = AuthorSerializer(author)
print(serializer.data)
Output
{"id": 1, "name": "Jane Doe", "books": [{"id": 1, "title": "Book One"}, {"id": 2, "title": "Book Two"}]}
⚠️

Common Pitfalls

Common mistakes when using nested serializers include:

  • Not setting many=True for multiple related objects, which causes errors.
  • Forgetting to set read_only=True if you don't want nested writes.
  • Trying to write nested data without overriding create or update methods, which DRF does not handle automatically.

Example of a common mistake and fix:

python
# Wrong: missing many=True for multiple related objects
class AuthorSerializer(serializers.ModelSerializer):
    books = BookSerializer()  # Should be many=True

    class Meta:
        model = Author
        fields = ['id', 'name', 'books']

# Right:
class AuthorSerializer(serializers.ModelSerializer):
    books = BookSerializer(many=True, read_only=True)

    class Meta:
        model = Author
        fields = ['id', 'name', 'books']
📊

Quick Reference

Tips for nested serializers in DRF:

  • Use many=True for lists of related objects.
  • Set read_only=True if you don't want to handle nested writes.
  • Override create and update methods to support nested writes.
  • Use related_name in models to simplify reverse relations.

Key Takeaways

Define a serializer for the related model and include it inside the main serializer as a nested field.
Use many=True for multiple related objects and read_only=True if you don't want nested writes.
DRF does not handle nested writes automatically; override create/update methods to support them.
Use related_name in Django models to access related objects easily in serializers.
Nested serializers help return detailed related data in API responses cleanly and efficiently.