Создание вложенных сериализаторов

Мы собираемся создать сериализатор для модели 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/

results matching ""

    No results matching ""