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")
- Inherit
NestedModelSerializer
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 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")
- Inherit
NestedModelSerializer
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 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")
- Inherit
NestedModelSerializer
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 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")
- Inherit
NestedModelSerializer
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 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")
- Inherit
NestedModelSerializer
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 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")
- Inherit
NestedModelSerializer
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 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")
- Inherit from
NestedModelSerializer
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")
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", ...)