📝 Вопросы на самопроверку: DRF-блок
⚡ Топ-5 вопросов
- Чем отличается
aggregate()отannotate()? - Что такое
validated_dataи когда он становится доступен? - Какой HTTP-статус вернуть при успешном создании объекта?
- Чем
ModelViewSetотличается отAPIView? - Как получить GET-параметр
?author=в DRF-представлении?
Блок А: ORM — агрегация и аннотации
А-1. aggregate vs annotate
Объясните разницу между aggregate() и annotate(). Какой тип значения возвращает каждый метод?
А-2. Функции агрегации
Перечислите пять основных функций агрегации Django ORM. Напишите запрос, который для модели Task вычисляет: общее количество задач, количество задач со статусом 'done' и количество просроченных задач.
А-3. order_by и срезы
Напишите запрос, который возвращает 5 самых дорогих книг, отсортированных по убыванию цены. Как добавить вторичную сортировку по названию?
А-4. Subquery и OuterRef
Для чего используется OuterRef? Напишите подзапрос, аннотирующий каждую книгу минимальной ценой книги того же автора.
А-5. ExpressionWrapper
Зачем нужен ExpressionWrapper? Напишите запрос, аннотирующий каждую книгу скидкой в процентах (поле discount_pct) на основе полей price и discounted_price.
Блок Б: Введение в DRF
Б-1. Зачем DRF
Что такое Django REST Framework? Какие проблемы он решает по сравнению с чистым Django?
Б-2. Установка
Перечислите шаги для подключения DRF к существующему Django-проекту.
Б-3. HTTP-статусы
Какой HTTP-статус следует вернуть в каждом из случаев:
- Успешное получение списка объектов (GET)
- Успешное создание объекта (POST)
- Успешное удаление (DELETE)
- Ошибка валидации входных данных
- Объект не найден
Блок В: Сериализаторы
В-1. Serializer vs ModelSerializer
Чем отличается serializers.Serializer от serializers.ModelSerializer? В каких ситуациях предпочтительнее каждый?
В-2. is_valid и validated_data
Что делает метод is_valid()? Почему нельзя обратиться к validated_data до вызова is_valid()?
В-3. read_only и write_only
Для чего используются атрибуты полей read_only=True и write_only=True? Приведите пример использования каждого.
В-4. Кастомная валидация
Напишите кастомный валидатор поля price в сериализаторе BookSerializer, который проверяет, что цена не отрицательная. Как добавить валидацию на уровне нескольких полей одновременно?
В-5. Переопределение create
Когда нужно переопределять методы create() и update() в сериализаторе? Напишите пример create(), который устанавливает текущую дату в поле created_at.
Блок Г: Представления (Views)
Г-1. @api_view vs APIView
Чем Function-Based View с @api_view отличается от Class-Based View с APIView? Когда предпочтительнее каждый подход?
Г-2. Generic views
Назовите три наиболее используемых generic view из DRF и объясните их назначение. Какие атрибуты обязательны для каждого?
Г-3. ModelViewSet + Router
Что такое ModelViewSet? Как подключить его через DefaultRouter? Какие URL генерирует роутер автоматически?
Г-4. request.data и request.query_params
Чем request.data отличается от request.query_params? В каком методе HTTP-запроса каждый из них используется?
Блок Д: query_params
Д-1. Фильтрация
Напишите APIView, принимающий параметры ?author= и ?is_bestseller=true и фильтрующий книги соответственно.
Д-2. Пагинация
Реализуйте ручную пагинацию через ?page= и ?page_size= в APIView. Как защититься от слишком большого page_size?
Ответы: solutions.html