Урок 31. Extract-методы, query_params (DRF)

📁 Блок: DRF ⏱️ Время изучения: ~70 мин 🎯 Сложность: Средняя
#drf #query_params #filtering #pagination #apiview #django-orm

⚡ Кратко: Extract-методы и query_params

Два инструмента урока: функции Extract* из Django ORM для фильтрации по компонентам даты/времени, и request.query_params в DRF APIView для гибкой фильтрации, сортировки и пагинации через URL-параметры.

  • Extract* (Django ORM): ExtractYear, ExtractMonth, ExtractDay, ExtractWeek, ExtractQuarter и другие — фильтрация/аннотация по частям даты
  • request.query_params: доступ к GET-параметрам из URL (аналог request.GET в Django)
  • Фильтрация: ?author=John&pub_year=2023 — динамические фильтры через словарь
  • Сортировка: ?sort_by=price&sort_order=desc — порядок через параметр
  • Пагинация: ?page=2&page_size=5PageNumberPagination + APIView

Топ-3 ошибки: 1) Не проверять, передан ли параметр (None как фильтр ломает запрос). 2) Смешивать request.GET и request.query_params в DRF. 3) Передавать строку в order_by() без валидации — SQL-инъекция.

📖 О чём этот урок

Урок 31 охватывает два связанных инструмента Django/DRF. Первая часть — функции извлечения компонентов даты/времени (Extract*) из django.db.models.functions: они позволяют фильтровать, аннотировать и агрегировать данные по году, месяцу, кварталу, дню недели и другим частям дат прямо в ORM-запросах.

Вторая часть — работа с query parameters в APIView. Параметры, передаваемые в URL после ?, доступны через request.query_params в DRF и позволяют реализовать динамическую фильтрацию, сортировку и пагинацию без изменения кода представления — только через URL.

Что изучим

  • Функции ExtractYear, ExtractMonth, ExtractDay, ExtractWeekDay, ExtractHour, ExtractMinute, ExtractSecond, ExtractWeek, ExtractQuarter
  • Два способа фильтрации по дате: прямая (встроенные lookups __year, __month) и через аннотацию + функцию Extract*
  • request.query_params — чтение GET-параметров в APIView
  • Фильтрация данных по нескольким параметрам через словарь filters
  • Сортировка через параметры sort_by и sort_order
  • Пагинация через PageNumberPagination + переопределение get_page_size

📚 Что повторить перед изучением

🎯 Что изучать дальше

  • → Урок 32: Summary session 6 — итоговое повторение DRF
  • django-filter — мощная библиотека для декларативной фильтрации в DRF
  • DRF: фильтрация через SearchFilter и OrderingFilter
  • Cursor-based пагинация для больших датасетов
  • Аутентификация и права доступа в DRF