Django DRF - вложенный сериализатор (уровень>2) не отображается в ответе
У нас есть следующая структура (library->books->pages)
первый сериализатор
class Library(serializers.ModelSerializer):
books = BookSerializer(many=True)
class Meta:
model = Library
fields = '__all__'
@transaction.atomic
def create(self, validated_data):
# create logic here
второй сериализатор
class BookSerializer(serializers.ModelSerializer):
results = PageSerializer(many=True, required=False)
class Meta:
model = Book
fields = '__all__'
у нас есть конечная точка library/
, куда мы отправляем полезную нагрузку следующего формата
{
"ref": "43a0c953-1380-43dd-a844-bbb97a325586",
"books": [
{
"name": "The Jungle Book",
"author": "Rudyard Kipling",
"pages": [
{
"content": "...",
"pagenumber": 22
}
]
}
]
}
все объекты созданы в базе данных, но ответ не содержит pages
ключа. Это выглядит следующим образом
{
"id": 27,
"ref": "43a0c953-1380-43dd-a844-bbb97a325586",
"books": [
{
"id": 34,
"name": "The Jungle Book",
"author": "Rudyard Kipling"
}
]
}
Атрибут depth
, похоже, не работает. Что мне нужно сделать, чтобы pages
появился в ответе?
Мы можем добиться желаемого поведения, используя depth
в class Meta
из BookSerializer
.
class BookSerializer(serializers.ModelSerializer):
...
class Meta:
...
depth = 3
Скопировано из Документации
Опция
depth
должна быть установлена на целочисленное значение, которое указывает глубину отношений, которые должны быть пройдены перед возвратом к плоскому представлению.
Другим способом добиться такого поведения было бы использование serializer.SerializerMethodField
для получения pages
сериализатора книги.
class BookSerializer(serializers.ModelSerializer):
pages = serializers.SerializerMethodField()
def get_pages(self, obj):
return PageSerializer(obj.page_set.all(), many=True,).data
...