skip to content

Nested & Writable Relations

Nested serializers render related objects read-only by default, so writes need create() and update() overrides, while related fields take ids or slugs. Interviewers probe writable nesting.

part ofDjango REST Frameworkoverview, primer and where to startread it →
on this pageshow

explore

questions

5

In Django REST Framework, how do you accept an order with nested line items in one POST, and why does the default ModelSerializer.create() refuse it?

level: seniorimportance: must knowfreq 64%

basics

~20 s

Declare items = LineItemSerializer(many=True) and override create(): pop the items, create the Order, then create each LineItem with order=order. The default ModelSerializer.create() raises an AssertionError on writable nested data because DRF will not guess how to persist it.

open as a page

In a Django REST Framework ModelSerializer, what does Meta.depth do, and why are the nested fields it generates read-only?

level: middleimportance: should knowfreq 42%

basics

~20 s

Meta.depth, from 0 to 10, makes a ModelSerializer render relations as nested objects instead of primary keys, auto-building a nested ModelSerializer with fields 'all' per level. Those generated fields are read_only=True, so clients can no longer set the relation.

open as a page

In Django REST Framework, how would you write update() for an order serializer whose nested line items clients can add, change or remove?

level: seniorimportance: should knowfreq 44%

basics

~20 s

Override update(): pop the items, save the order's own fields, then match incoming items by id against order.items — update matches, create items without an id, delete ones left out. Declare id as a writable IntegerField, because ModelSerializer's auto id is read-only.

open as a page