🏠 Закрепляющая практика
Информация: Это закрепляющее задание составлено по материалу урока 35. Оно не является LMS-домашним заданием — это дополнительная практика для самостоятельного закрепления навыков после урока.
⚡ Задания кратко
- Добавить эндпоинт
GET /api/v1/users/<pk>/— детальная информация о пользователе - Добавить soft-delete для пользователей: вместо физического удаления устанавливать
deleted=True, deleted_at=now() - Добавить фильтрацию задач по assignee через query param
?assignee=email - Написать эндпоинт
PATCH /api/v1/users/<pk>/для частичного обновления пользователя
Подготовка окружения
# Клонировать или открыть существующий проект
cd agile_project
# Активировать виртуальное окружение
# Windows:
.venv\Scripts\activate
# Linux/macOS:
source .venv/bin/activate
# Убедиться, что зависимости установлены
pip install django djangorestframework
# Запустить сервер
python manage.py runserver
Задание 1 — Детальная информация о пользователе
Добавьте эндпоинт для получения полной информации о конкретном пользователе.
- Создайте сериализатор
UserDetailSerializerс полями:- username, first_name, last_name, email, phone
- position, is_active, deleted
- registered (date_joined), last_login
- project (вложенный сериализатор с именем проекта)
- Создайте
UserDetailGenericView(RetrieveAPIView)с методомget_object. - Добавьте URL:
path('<int:pk>/', UserDetailGenericView.as_view()) - Проверьте в Postman:
GET /api/v1/users/1/
Задание 2 — Soft-delete для пользователей
Вместо физического удаления пользователей устанавливать флаг deleted=True.
- Создайте
UserDeleteGenericView(DestroyAPIView). - Переопределите метод
destroy: вместоinstance.delete()выполнять:from django.utils import timezone instance.deleted = True instance.deleted_at = timezone.now() instance.is_active = False instance.save() - Добавьте URL:
path('<int:pk>/delete/', UserDeleteGenericView.as_view()) - Убедитесь, что мягко удалённые пользователи не возвращаются в
UserListGenericView:def get_queryset(self): return User.objects.filter(deleted=False, ...)
Задание 3 — Фильтрация задач по assignee
В существующем AllTasksListAPIView добавьте возможность фильтрации по email назначенного разработчика.
- В
get_querysetдобавьте обработку параметра?assignee_email=...:assignee_email = self.request.query_params.get('assignee_email') if assignee_email: queryset = queryset.filter(assignee__email=assignee_email) - Протестируйте:
GET /api/v1/tasks/?assignee_email=dev@example.com
Задание 4 — Частичное обновление пользователя
- Создайте сериализатор
UpdateUserSerializerс полями: phone, position, first_name, last_name. - Создайте
UserUpdateGenericView(UpdateAPIView)сpartial=True. - Добавьте URL:
path('<int:pk>/', UserUpdateGenericView.as_view()) - Протестируйте в Postman:
PATCH /api/v1/users/1/с телом{"phone": "+7999000111"}
Проверка в VS Code / Postman
VS Code — запуск через F5
Создайте/обновите .vscode/launch.json:
{
"version": "0.2.0",
"configurations": [
{
"name": "Django",
"type": "debugpy",
"request": "launch",
"program": "${workspaceFolder}/manage.py",
"args": ["runserver", "--noreload"],
"django": true,
"justMyCode": false
}
]
}
Нажмите F5 — откроется сервер с точками останова.
Postman — коллекция запросов
# Получить список пользователей
GET http://localhost:8000/api/v1/users/
# Получить пользователей проекта
GET http://localhost:8000/api/v1/users/?project_name=Alpha
# Зарегистрировать нового пользователя
POST http://localhost:8000/api/v1/users/register/
Content-Type: application/json
{
"username": "john_doe",
"first_name": "John",
"last_name": "Doe",
"email": "john@example.com",
"position": "PROGRAMMER",
"password": "SecurePass123!",
"re_password": "SecurePass123!"
}
# Скачать файл
GET http://localhost:8000/api/v1/projects/files/download/1/
Связь с теорией и примерами
- Задание 1 — AbstractBaseUser, UserListGenericView
- Задание 2 — Soft-delete pattern, поля
deleted/deleted_at - Задание 3 — get_queryset с фильтрацией
- Задание 4 — UpdateAPIView, partial update