๐Ÿ“ Django

Nested Serializers in DRF

P
Author
PyLand Team
๐Ÿ“…
Published
30.06.2026
โฑ๏ธ
Reading time
1 min
๐Ÿ‘๏ธ
Views
298
๐Ÿ†
Level
Expert

Covered topics: Reading Nested Objects, Write by ID, Read as Object, Nested List (Reverse Relation), Writing Nested Objects.

Reading Nested Objects

class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Project
        fields = ['id', 'name']

class TaskSerializer(serializers.ModelSerializer):
    project = ProjectSerializer(read_only=True)  # nested object

    class Meta:
        model = Task
        fields = ['id', 'title', 'status', 'project']

API response:

{
  "id": 1,
  "title": "Task",
  "project": {"id": 5, "name": "My Project"}
}

Write by ID, Read as Object

class TaskSerializer(serializers.ModelSerializer):
    project = ProjectSerializer(read_only=True)         # for GET
    project_id = serializers.PrimaryKeyRelatedField(    # for POST/PUT
        queryset=Project.objects.all(),
        source='project',
        write_only=True,
    )

    class Meta:
        model = Task
        fields = ['id', 'title', 'project', 'project_id']

Nested List (Reverse Relation)

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = ['id', 'title', 'status']

class ProjectSerializer(serializers.ModelSerializer):
    tasks = TaskSerializer(many=True, read_only=True)  # via related_name='tasks'

    class Meta:
        model = Project
        fields = ['id', 'name', 'tasks']

Writing Nested Objects

class ProjectSerializer(serializers.ModelSerializer):
    tasks = TaskSerializer(many=True)

    class Meta:
        model = Project
        fields = ['id', 'name', 'tasks']

    def create(self, validated_data):
        tasks_data = validated_data.pop('tasks', [])
        project = Project.objects.create(**validated_data)
        for task_data in tasks_data:
            Task.objects.create(project=project, **task_data)
        return project

    def update(self, instance, validated_data):
        tasks_data = validated_data.pop('tasks', [])
        instance = super().update(instance, validated_data)
        # Update tasks...
        return instance

SerializerMethodField

class TaskSerializer(serializers.ModelSerializer):
    project_name = serializers.SerializerMethodField()

    def get_project_name(self, obj):
        return obj.project.name if obj.project else None

Your reaction to the article

๐Ÿ’ฌ Comments (0)

๐Ÿ” Sign in to leave a comment
๐Ÿšช Login
๐Ÿ’ญ

No comments yet

Be the first to share your opinion about this article!

๐Ÿ”— Similar

Similar articles

Continue learning with these materials

๐Ÿ“

Search in Django

You can start with simple Django ORM filters and move to PostgreSQL features when you...

๐Ÿ“… 30.06.2026 ๐Ÿ‘๏ธ 277
๐Ÿ“

Swagger Documentation with drf-spectacular

drf-spectacular generates an OpenAPI 3.0 schema and Swagger UI for DRF.

๐Ÿ“… 30.06.2026 ๐Ÿ‘๏ธ 561
๐Ÿ“

settings.py: Django Configuration

settings.py is the central configuration file for a Django project.

๐Ÿ“… 30.06.2026 ๐Ÿ‘๏ธ 313

Did you like the article?

Subscribe to our updates and be the first to receive new articles. Grow with PyLand!