Создание вложенных сериализаторов
Мы собираемся создать сериализатор для модели Course. Отредактируйте файл api/serializers.py и добавьте в него следующий код:
from ..models import Course
class CourseSerializer(serializers.ModelSerializer):
class Meta:
model = Course
fields = ('id', 'subject', 'title', 'slug', 'overview', 'created', 'owner', 'modules')
Давайте рассмотрим, как сериализуется объект Course. Откройте терминал, запустите python manage.py shell
и выполните следующий код:
from rest_framework.renderers import JSONRenderer
from courses.models import Course
from courses.api.serializers import CourseSerializer
course = Course.objects.latest('id')
serializer = CourseSerializer(course)
JSONRenderer().render(serializer.data)
Вы получите объект JSON с полями, которые мы включили в CourseSerializer. Можно увидеть, что связанные объекты диспетчера modules сериализуются как список первичных ключей, например:
"modules": [17, 18, 19, 20, 21, 22]
Мы хотим включить дополнительные сведения о каждом модуле, поэтому необходимо сериализовать объекты модуля и вложить их. Отредактируйте api/serializers.py так, чтобы выглядеть следующим образом:
from rest_framework import serializers
from ..models import Course, Module
class ModuleSerializer(serializers.ModelSerializer):
class Meta:
model = Module
fields = ('order', 'title', 'description')
class CourseSerializer(serializers.ModelSerializer):
modules = ModuleSerializer(many=True, read_only=True)
class Meta:
model = Course
fields = ('id', 'subject', 'title', 'slug', 'overview', 'created', 'owner', 'modules')
Мы определили ModuleSerializer, чтобы обеспечить сериализацию для модели Module. Затем мы добавляем атрибут modules в класс CourseSerializer, чтобы вложить сериализатор ModuleSerializer. Мы установили many=True, чтобы указать, что мы сериализуемые несколько объектов. Параметр read_only указывает, что это поле предназначено только для чтения и не должно включаться во входные данные для создания или обновления объектов.
Откройте терминал и снова создайте экземпляр CourseSerializer. Он отрисует атрибут data сериализатора с JSONRenderer. На этот раз перечисленные модули сериализуются со вложенным сериализатором ModuleSerializer:
"modules": [
{
"order": 0,
"title": "Django overview",
"description": "A brief overview about the Web Framework."
},
{
"order": 1,
"title": "Installing Django",
"description": "How to install Django."
},
...
]
Больше сведений о сериализаторах здесь: http://www.django-rest-framework.org/api-guide/serializers/