Skip to content

DRF Getting Started

Usage

A serializer just needs to inherit from NestedSerializer to allow writable nested serializers:

from drf_nested_serializer.serializer import NestedSerializer
from rest_framework.serializers import ModelSerializer
from .models import MyNestedModel, MyParentModel

class MyNestedSerializer(ModelSerializer):
    class Meta:
        model = MyNestedModel
        fields = ("id", )

class MyParentSerializer(NestedSerializer): # (1)
    nested = MyNestedSerializer()

    class Meta:
        model = MyParentModel
        fields = ("id", "nested")
  1. Inherit NestedSerializer to allow writable nested serializers (instead of ModelSerializer)
from django.db import models

class MyNestedModel(models.Model):
    pass

class MyParentModel(models.Model):
    nested = models.OneToOneField(MyNestedModel, on_delete=models.CASCADE)
from drf_nested_serializer.serializer import NestedSerializer
from rest_framework.serializers import ModelSerializer
from .models import MyNestedModel, MyParentModel

class MyNestedSerializer(ModelSerializer):
    class Meta:
        model = MyNestedModel
        fields = ("id", )

class MyParentSerializer(NestedSerializer): # (1)
    nested = MyNestedSerializer()

    class Meta:
        model = MyParentModel
        fields = ("id", "nested")
  1. Inherit NestedSerializer to allow writable nested serializers (instead of ModelSerializer)
from django.db import models

class MyNestedModel(models.Model):
    parent = models.OneToOneField("MyParentModel", on_delete=models.CASCADE, related_name="nested")

class MyParentModel(models.Model):
    pass
from drf_nested_serializer.serializer import NestedSerializer
from rest_framework.serializers import ModelSerializer
from .models import MyNestedModel, MyParentModel

class MyNestedSerializer(ModelSerializer):
    class Meta:
        model = MyNestedModel
        fields = ("id", )

class MyParentSerializer(NestedSerializer): # (1)
    nested = MyNestedSerializer()

    class Meta:
        model = MyParentModel
        fields = ("id", "nested")
  1. Inherit NestedSerializer to allow writable nested serializers (instead of ModelSerializer)
from django.db import models

class MyNestedModel(models.Model):
    pass

class MyParentModel(models.Model):
    nested = models.ForeignKey(MyNestedModel, on_delete=models.CASCADE)
from drf_nested_serializer.serializer import NestedSerializer
from rest_framework.serializers import ModelSerializer
from .models import MyNestedModel, MyParentModel

class MyNestedSerializer(ModelSerializer):
    class Meta:
        model = MyNestedModel
        fields = ("id", )

class MyParentSerializer(NestedSerializer): # (1)
    nested = MyNestedSerializer(many=True)

    class Meta:
        model = MyParentModel
        fields = ("id", "nested")
  1. Inherit NestedSerializer to allow writable nested serializers (instead of ModelSerializer)
from django.db import models

class MyNestedModel(models.Model):
    parent = models.ForeignKey("MyParentModel", on_delete=models.CASCADE, related_name="nested")

class MyParentModel(models.Model):
    pass
from drf_nested_serializer.serializer import NestedSerializer
from rest_framework.serializers import ModelSerializer
from .models import MyNestedModel, MyParentModel

class MyNestedSerializer(ModelSerializer):
    class Meta:
        model = MyNestedModel
        fields = ("id", )

class MyParentSerializer(NestedSerializer): # (1)
    nested = MyNestedSerializer(many=True)

    class Meta:
        model = MyParentModel
        fields = ("id", "nested")
  1. Inherit NestedSerializer to allow writable nested serializers (instead of ModelSerializer)
from django.db import models

class MyNestedModel(models.Model):
    pass

class MyParentModel(models.Model):
    nested = models.ManyToManyField(MyNestedModel)
from drf_nested_serializer.serializer import NestedSerializer
from rest_framework.serializers import ModelSerializer
from .models import MyNestedModel, MyParentModel

class MyNestedSerializer(ModelSerializer):
    class Meta:
        model = MyNestedModel
        fields = ("id", )

class MyParentSerializer(NestedSerializer): # (1)
    nested = MyNestedSerializer(many=True)

    class Meta:
        model = MyParentModel
        fields = ("id", "nested")
  1. Inherit NestedSerializer to allow writable nested serializers (instead of ModelSerializer)
from django.db import models

class MyNestedModel(models.Model):
    parent = models.ManyToManyField(MyNestedModel, related_name="nested")

class MyParentModel(models.Model):
    pass
from drf_nested_serializer.serializer import NestedSerializer
from rest_framework.serializers import ModelSerializer
from .models import MyThroughModel, MyParentModel

class MyThroughSerializer(ModelSerializer):
    class Meta:
        model = MyThroughModel
        fields = ("id", "nested")

class MyParentSerializer(NestedSerializer): # (1)
    through = MyThroughSerializer(many=True)

    class Meta:
        model = MyParentModel
        fields = ("id", "through")
  1. Inherit from NestedSerializer to allow writable nested serializers (instead of ModelSerializer)
from django.db import models

class MyNestedModel(models.Model):
    pass

class MyParentModel(models.Model):
    nested = models.ManyToManyField(MyNestedModel, through="MyThroughModel")

class MyThroughModel(models.Model):
    nested = models.ForeignKey(MyNestedModel, on_delete=models.CASCADE)
    parent = models.ForeignKey(MyParentModel, on_delete=models.CASCADE, related_name="through")

Nested Data

data = {
    # omit `nested`



}
serializer = MyParentSerializer(data=data)
if serializer.is_valid():
    instance = serializer.save()

data = {
    "nested": None



}
serializer = MyParentSerializer(data=data)
if serializer.is_valid():
    instance = serializer.save()

data = {
    "nested": {
        "id": None,
        "name": "John Doe",
    }
}
serializer = MyParentSerializer(data=data)
if serializer.is_valid():
    instance = serializer.save()

data = {
    "nested": {
        "id": 3,

    }
}
serializer = MyParentSerializer(data=data)
if serializer.is_valid():
    instance = serializer.save()

data = {
    "nested": {
        "id": 3,
        "name": "John Doe",
    }
}
serializer = MyParentSerializer(data=data)
if serializer.is_valid():
    instance = serializer.save()

Inclusion and Exclusion

If not all nested serializers should be handled, you can explicitly include or exclude fields:

class MyParentSerializer(NestedSerializer):
    ...
    class Meta:
        ...
        nested_include = "__all__" # or omitted
class MyParentSerializer(NestedSerializer):
    ...
    class Meta:
        ...
        nested_include = ("field_1", "field_2", ...)
class MyParentSerializer(NestedSerializer):
    ...
    class Meta:
        ...
        nested_exclude = "__all__"
class MyParentSerializer(NestedSerializer):
    ...
    class Meta:
        ...
        nested_exclude = ("field_1", "field_2", ...)