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 includesRelatedSerializeras 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=Truefor multiple related objects, which causes errors. - Forgetting to set
read_only=Trueif you don't want nested writes. - Trying to write nested data without overriding
createorupdatemethods, 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=Truefor lists of related objects. - Set
read_only=Trueif you don't want to handle nested writes. - Override
createandupdatemethods to support nested writes. - Use
related_namein 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.