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")
- Inherit
NestedSerializer
to allow writable nested serializers (instead ofModelSerializer
)
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")
- Inherit
NestedSerializer
to allow writable nested serializers (instead ofModelSerializer
)
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")
- Inherit
NestedSerializer
to allow writable nested serializers (instead ofModelSerializer
)
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")
- Inherit
NestedSerializer
to allow writable nested serializers (instead ofModelSerializer
)
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")
- Inherit
NestedSerializer
to allow writable nested serializers (instead ofModelSerializer
)
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")
- Inherit
NestedSerializer
to allow writable nested serializers (instead ofModelSerializer
)
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")
- Inherit from
NestedSerializer
to allow writable nested serializers (instead ofModelSerializer
)
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", ...)