Урок 35. Доп. практикум 7: мини-проект «Agile Projects» ч.3

📁 Блок: DRF ⏱️ Время изучения: ~120 мин 🎯 Сложность: Средняя–Высокая
#django #drf #agile #generics #customuser #serializers #регистрация #fileresponse #мини-проект #практикум

⚡ Кратко: мини-проект Agile Projects — часть 3

Завершение REST API-платформы «Agile Projects». 7 задач: расширение API файлов (список + детали + скачивание), кастомная модель User, регистрация с валидацией пароля, назначение разработчика на задачу, скачивание файлов через FileResponse. Django 5.x + DRF 3.15+.

  • Задача 1 (список файлов): get_serializer_class, get_queryset с фильтром по имени проекта, метод list с 204 при пустом результате
  • Задача 2 (детали + удаление файла): ProjectFileDetailSerializer, ProjectFileDetailGenericView — GET/DELETE, физическое удаление через delete_file()
  • Задача 3 (кастомный User): AbstractBaseUser + PermissionsMixin, 14 полей, USERNAME_FIELD = "email", AUTH_USER_MODEL
  • Задача 4 (список пользователей): UserListSerializer, UserListGenericView с фильтром по имени проекта
  • Задача 5 (регистрация): RegisterUserSerializer с regex-валидацией + validate_password, RegisterUserGenericView
  • Задача 6 (assignee): SlugRelatedField(slug_field='email') в CreateUpdateTaskSerializer
  • Задача 7 (скачивание): DownloadProjectFileView с FileResponse, Content-Disposition attachment

Топ-3 ошибки: 1) Не добавить AUTH_USER_MODEL до первой миграции — придётся пересоздавать БД. 2) re_password не убирать из validated_data перед созданием — ошибка unexpected field. 3) Порядок URL-паттернов — files/download/<pk>/ должен стоять выше files/<pk>/.

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

Урок 35 — дополнительный практикум 7, заключительная итерация проекта «Agile Projects». Добавляем всё необходимое для работы с пользователями и файлами: расширенный API управления файлами, полноценную кастомную систему пользователей (регистрация, список, назначение на задачи) и скачивание файлов.

Ключевые концепции этого урока:

  • Generic Views — тонкая настройка: get_serializer_class позволяет возвращать разный сериализатор для GET и POST в одном view-классе
  • Физическое удаление файлов: os.remove(os.path.realpath(path)) — удаление из файловой системы, а не только из БД
  • AbstractBaseUser: полная замена стандартного пользователя Django с произвольным полем-ключом
  • Regex-валидация в сериализаторах: модуль re для проверки имён и логинов
  • FileResponse: стриминг файла из Django с правильными заголовками для скачивания
  • SlugRelatedField: связь по человекочитаемому полю (email) вместо id

Предыдущие части: Урок 28: ч.1 и Урок 30: ч.2.

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

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

  • → Урок 36: Основы DRF — часть 4
  • DRF: Authentication (TokenAuth, JWT), Permissions
  • DRF: ViewSet + Router — автоматическая маршрутизация
  • Django: signals — автоматические триггеры при сохранении модели
  • Django: кастомные валидаторы пароля