✅ Решения — Урок 29

← К оглавлению урока | ← К заданиям

⚡ Ответы

Блок 1: 1→B, 2→C, 3→C, 4→C, 5→A,B,C, 6→A,B,C

Блок 2: 7→A, 8→B, 9→C, 10→C, 11→B, 12→A,B,C,D, 13→B,C, 14→A,B,C, 15→C

Блок 3: 16→B, 17→B, 18→A,B,C,D

Блок 1: Поля для отношений между моделями

Вопрос 1 — Ответ: B. PrimaryKeyRelatedField
PrimaryKeyRelatedField используется для сериализации/десериализации связанного объекта по его первичному ключу (ID). Это стандартный способ работы с FK в сериализаторах DRF.
Вопрос 2 — Ответ: C. StringRelatedField
StringRelatedField отображает строковое представление связанного объекта — результат метода __str__(). Поле только для чтения.
Вопрос 3 — Ответ: C. SlugRelatedField
SlugRelatedField использует конкретное поле модели (slug) для идентификации связанного объекта. Позволяет читать и записывать по slug-значению вместо ID.
Вопрос 4 — Ответ: C. PrimaryKeyRelatedField
Для Many-to-Many отношений используется PrimaryKeyRelatedField с параметром many=True:
genres = serializers.PrimaryKeyRelatedField(queryset=Genre.objects.all(), many=True)
D неверно — ManyToManyField — это поле Django ORM, не DRF-сериализатора.
Вопрос 5 — Ответы: A, B, C
Для ForeignKey подходят три поля:
  • A. PrimaryKeyRelatedField — по ID (стандарт)
  • B. SlugRelatedField — по slug-полю
  • C. StringRelatedField — только чтение, через __str__()
D (ManyRelatedField) — внутренний класс DRF для M2M, не для FK.
Вопрос 6 — Ответы: A, B, C
Для Many-to-Many подходят:
  • A. PrimaryKeyRelatedField с many=True
  • B. ManyRelatedField — базовый класс для M2M
  • C. SlugRelatedField с many=True — по slug
D (StringRelatedField) также работает с M2M (many=True), но только для чтения.

Блок 2: Class-Based Views

Вопрос 7 — Ответ: A. APIView
APIView — базовый класс для создания CBV в DRF. Все остальные классы (GenericAPIView, Generic Views, ViewSets) наследуются от него. GenericAPIView — следующий уровень иерархии.
Вопрос 8 — Ответ: B. ModelViewSet
ModelViewSet объединяет ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin и GenericAPIView — полный набор CRUD.
Вопрос 9 — Ответ: C. ListCreateAPIView
ListCreateAPIView = ListModelMixin + CreateModelMixin + GenericAPIView. Обрабатывает GET (список) и POST (создание) на одном URL.
Вопрос 10 — Ответ: C. CreateModelMixin
CreateModelMixin добавляет метод create(), который обрабатывает POST-запросы — валидирует и сохраняет новый объект.
Вопрос 11 — Ответ: B. ReadOnlyModelViewSet
ReadOnlyModelViewSet предоставляет только list() и retrieve() — операции GET. Подходит для справочников и данных только для чтения.
Вопрос 12 — Ответы: A, B, C, D
Все четыре миксина используются с GenericAPIView:
  • CreateModelMixin — POST (создание)
  • UpdateModelMixin — PUT/PATCH (обновление)
  • DestroyModelMixin — DELETE (удаление)
  • ListModelMixin — GET список
Плюс RetrieveModelMixin (не перечислен) — GET одного объекта.
Вопрос 13 — Ответы: B, C
Generic Views = классы из rest_framework.generics:
  • B. RetrieveAPIView — да
  • C. CreateAPIView — да
A (APIView) — базовый класс, не Generic View. D (ModelViewSet) — ViewSet, не Generic View.
Вопрос 14 — Ответы: A, B, C
Преимущества CBV перед FBV:
  • A. Объектно-ориентированный подход — код в классах, наследование
  • B. Инкапсуляция логики — каждый HTTP-метод в своём методе класса
  • C. Управление состоянием — атрибуты экземпляра класса
D неверно — писать код всё равно нужно; CBV лишь структурирует его лучше.
Вопрос 15 — Ответ: C. ListCreateAPIView
ListCreateAPIView обрабатывает и GET (список), и POST (создание) на одном endpoint. ListAPIView (A) — только список. CreateAPIView (B) — только создание.

Блок 3: APIView

Вопрос 16 — Ответ: B. post
Метод post(self, request) обрабатывает POST-запросы — используется для создания нового объекта. Возвращает HTTP_201_CREATED при успехе.
Вопрос 17 — Ответ: B. as_view()
ClassName.as_view() — метод, унаследованный от Django View, преобразующий класс в вызываемую функцию представления для регистрации в urls.py:
path('books/', BookListView.as_view(), name='book-list')
Вопрос 18 — Ответы: A, B, C, D
APIView поддерживает все основные HTTP-методы:
  • get() — GET-запросы
  • post() — POST-запросы
  • put() — PUT-запросы (полное обновление)
  • delete() — DELETE-запросы
Также поддерживается patch() (частичное обновление) и head(), options().