Skip to content

DRF Getting Started

Usage

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

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

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

class MyParentSerializer(NestedModelSerializer): # (1)
    nested = MyNestedModelSerializer()

    class Meta:
        model = MyParentModel
        fields = ("id", "nested")
  1. Inherit NestedModelSerializer 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 NestedModelSerializer
from rest_framework.serializers import ModelSerializer
from .models import MyNestedModel, MyParentModel

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

class MyParentSerializer(NestedModelSerializer): # (1)
    nested = MyNestedModelSerializer()

    class Meta:
        model = MyParentModel
        fields = ("id", "nested")
  1. Inherit NestedModelSerializer 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 NestedModelSerializer
from rest_framework.serializers import ModelSerializer
from .models import MyNestedModel, MyParentModel

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

class MyParentSerializer(NestedModelSerializer): # (1)
    nested = MyNestedModelSerializer()

    class Meta:
        model = MyParentModel
        fields = ("id", "nested")
  1. Inherit NestedModelSerializer 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 NestedModelSerializer
from rest_framework.serializers import ModelSerializer
from .models import MyNestedModel, MyParentModel

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

class MyParentSerializer(NestedModelSerializer): # (1)
    nested = MyNestedModelSerializer(many=True)

    class Meta:
        model = MyParentModel
        fields = ("id", "nested")
  1. Inherit NestedModelSerializer 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 NestedModelSerializer
from rest_framework.serializers import ModelSerializer
from .models import MyNestedModel, MyParentModel

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

class MyParentSerializer(NestedModelSerializer): # (1)
    nested = MyNestedModelSerializer(many=True)

    class Meta:
        model = MyParentModel
        fields = ("id", "nested")
  1. Inherit NestedModelSerializer 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 NestedModelSerializer
from rest_framework.serializers import ModelSerializer
from .models import MyNestedModel, MyParentModel

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

class MyParentSerializer(NestedModelSerializer): # (1)
    nested = MyNestedModelSerializer(many=True)

    class Meta:
        model = MyParentModel
        fields = ("id", "nested")
  1. Inherit NestedModelSerializer 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 NestedModelSerializer
from rest_framework.serializers import ModelSerializer
from .models import MyThroughModel, MyParentModel

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

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

    class Meta:
        model = MyParentModel
        fields = ("id", "through")
  1. Inherit from NestedModelSerializer 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")

Data

data = {

}
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(NestedModelSerializer):
    ...
    class Meta:
        ...
        nested_include = "__all__" # or omitted
class MyParentSerializer(NestedModelSerializer):
    ...
    class Meta:
        ...
        nested_include = ("field_1", "field_2", ...)
class MyParentSerializer(NestedModelSerializer):
    ...
    class Meta:
        ...
        nested_exclude = "__all__"
class MyParentSerializer(NestedModelSerializer):
    ...
    class Meta:
        ...
        nested_exclude = ("field_1", "field_2", ...)