📝 Практикум 3: задачи
⚡ Все задачи — кратко
- 1: Django shell → создать 5 тэгов (Backend, Frontend, Q&A, Design, DevOPS) → save()
- 2: Создать 2 проекта (TIGER, SapHYR INC) через objects и save()/create()
- 3: Создать ProjectFile для каждого проекта → привязать через add()
- 4: Создать 5 пользователей (backend_dev, frontend_dev, designer, devops, qa_dev)
- 5: Для каждого проекта создать задачи (Task) с FK на проект и исполнителя
- 6: Добавить тэги к задачам через M2M .add()
- 7: all(), first(), last(), count() для Tag
- 8: filter().exists() — проверить наличие тэга
- 9: filter(name__icontains='e') — фильтрация тэгов по строке
- 10: filter(date_of_creation__gt=req_date) — проекты по дате
- 11: Q-класс: дата AND имя__icontains
- 12: filter(project__name__contains='TIGER') — файлы через связь
- 13: filter(status='new', priority='Urgent') — вывести детали задач
- 14: filter().update(status='pending')
- 15: Q: (status='new' AND priority='Urgent') OR NOT tags__name='Q&A'
- 16: F-класс: filter(due_date__month=...).update(priority='Critical')
- 17: update(due_date=F('due_date') + timedelta(weeks=1))
- 18: filter(assignee__isnull=True)
- 19: filter(tags__name__icontains='Q&A') — задачи через тэг
- 20: ProjectFile за последнюю неделю → проекты через project_files__in
- 21: bulk_update статуса 'new' → 'in_progress'
- 22: bulk_update due_date += 3 дня для status='in_progress'
- 23: annotate(Count) → filter по дате и file_count
- 24: Функция конца месяца → filter Q(priority) & due_date__lte
- 25: exclude(Q(status='pending') | Q(status='closed'))
- 26: filter по проекту и created_date__lt → update(priority='Urgent')
Перед началом: все задачи выполняются в Django shell (
python manage.py shell). Задачи 1–6 создают данные, задачи 7–26 — работают с ними. Выполняйте последовательно в одной сессии shell.
Блок 1: Создание данных (задачи 1–6)
Задание 1 — Создание тэгов для будущих задач
- Зайдите в Django shell консоль.
- Импортируйте модель
Tag. - Создайте объекты тэгов по направлениям:
- Backend
- Frontend
- Q&A
- Design
- DevOPS
- Сохраните изменения в базу данных.
Задание 2 — Создание проектов
- Импортируйте необходимый(е) классы для работы.
- Создайте несколько объектов проекта, используя менеджер
objectsу модели. - Убедитесь, что данные были успешно записаны в базу данных.
Задание 3 — Добавление файлов к проектам
- Импортируйте модели
Project,ProjectFile. - Создайте несколько записей файлов для каждого из существующих проектов.
- Для каждого объекта проекта, созданного ранее, добавьте объекты созданных файлов методом
add(). - Убедитесь, что данные были созданы и сохранены в базу данных.
Задание 4 — Создание пользователей для работы в проекте
- Импортируйте модель Пользователя (
User), которого по умолчанию предлагает Django. - Создайте пять разных пользователей:
- Backend
- Frontend
- DevOPS
- Q&A
- Designer
- Убедитесь, что все они сохранены в базу данных.
Задание 5 — Создание задач для проектов
- Импортируйте модель
Task. - Для каждого проекта создайте задачи. По одной-две для каждого тега.
- Для foreignkey полей передаём объекты, которые мы создавали ранее.
- Убедитесь, что данные были созданы и сохранены в базу данных.
Задание 6 — Добавление тэгов для всех задач
- Получите все объекты тегов.
- У каждого объекта созданных задач обратитесь к полю тегов через точку.
- У поля ManyToMany (
tags) вызовите методaddи передайте ему объект тега.- Объект тега будет зависеть от того, какой title будет в задаче, например: ('Добавить новый эндпоинт' — Backend tag, 'Обновить страницу ответа 404' — Frontend tag)
Блок 2: Базовые запросы (задачи 7–12)
Задание 7 — Получение тегов
- Импортируйте модели тегов
Tag. - Напишите запрос, который позволит получить список всех тегов.
- Выведите имя каждого тега.
- Получите самый первый тег.
- Получите самый последний тег.
- Получите кол-во всех тегов.
Задание 8 — Проверка существования тега с именем
- Напишите запрос, который будет искать тэг по определённому имени.
- Проверьте наличие такого тега методом, который выдаёт
TrueилиFalseна наличие объекта.
Задание 9 — Фильтрация тегов по имени
- Напишите запрос, который позволит получить теги, у которых в имени будет совпадение по переданной строке, например: «...Tag»
- Выведите имена всех этих тегов.
Задание 10 — Фильтрация проектов по дате создания
- Импортируйте модуль
datetimeи модельProject. - Создайте объект даты, по которой нужно сделать поиск.
- Напишите запрос, который позволит получить список проектов, которые равны или старше переданной даты создания.
- Выведите имена таких проектов.
Задание 11 — Использование Q-класса для комбинированных условий
- Импортируйте модель
Project. - Напишите запрос, который позволит получить необходимые проекты:
- Реализуйте фильтрацию, которая будет проходить два условия:
- Проекты, равные или больше указанной даты
- Проекты, у которых в имени есть строка 'TI'
- Реализуйте фильтрацию, которая будет проходить два условия:
- Выведите имена таких проектов.
Задание 12 — Получение списка всех файлов для проекта
- Напишите запрос, который позволит получить список всех файлов, которые привязаны к конкретному проекту. Поиск произведите по имени проекта.
- Выведите только пути к каждому файлу.
Блок 3: Продвинутая фильтрация (задачи 13–20)
Задание 13 — Фильтрация задач по статусу и приоритету
- Напишите запрос, который поможет получить только те задачи, у которых:
- Статус «new»
- Приоритетность «Urgent»
- Выведите информацию по каждой такой задаче:
- Название
- Статус
- Приоритетность
- Дата, когда задача должна быть сдана
- Email сотрудника, за которым закреплена эта задача
Задание 14 — Обновление статуса задачи
- Напишите запрос, который поможет получить конкретную задачу.
- Обратитесь к полю статуса и обновите его на новое значение, например «pending». Сделайте это через метод
update().
Задание 15 — Получение задач через комбинацию условий
- Напишите запрос, который будет содержать в себе прохождение одной из комбинаций:
- статус и приоритетность
- прохождение несовпадения по тегу
- Выведите название этих задач, проект и email разработчиков.
Задание 16 — Обновление приоритета задач
- Импортируйте модель
Task. - Импортируйте
Fкласс. - Обновите приоритет задач, которые должны быть выполнены в следующем месяце, на «Critical». Используйте F-класс.
Задание 17 — Увеличение даты выполнения всех задач на неделю
- Импортируйте модуль
timedeltaиз библиотекиdatetime. - Импортируйте модель
Task. - Обновите все объекты задач по полю
due_dateна +1 неделю. Используйте F-класс.
Задание 18 — Фильтрация задач, у которых нет прикрепленного разработчика
- Импортируйте модель
Task. - Напишите запрос, который поможет профильтровать по lookups-полю те задачи, у которых нет назначенного разработчика.
- Выведите название таких задач и название проекта для этих задач.
Задание 19 — Получение задач
Необходимо получить все задачи, связанные с тэгами и содержащими определённое ключевое слово.
- Импортируйте модель
Task. - Напишите запрос, который поможет отфильтровать задачи через конкретный тэг.
- Запрос должен быть написан с использованием lookups-полей
- Запрос должен начинаться с модели
Task, через эту модель нужно получить доступ к конкретному тэгу
- Выведите информацию по каждой задаче:
- Имя задачи
- Статус задачи
- Приоритет задачи
- Имя проекта этой задачи
Задание 20 — Получение проектов
Необходимо получить все проекты, связанные с файлами, созданными в определенный период (последняя неделя).
- Импортируйте модели
Project,ProjectFile. - Создайте переменную с датой периода создания файлов (от текущего дня −7 дней).
- Напишите первый запрос, который поможет получить те файлы, которые должны быть больше или равны полученной дате по полю создания этого файла.
- Напишите запрос, который поможет получить только те проекты, у которых есть те файлы, что мы получили предыдущим запросом.
- Выведите информацию об этих проектах: имя проекта и дата создания.
Блок 4: Массовые операции и агрегация (задачи 21–26)
Задание 21 — Массовое обновление статуса задач
- Импортируйте модель
Task. - Напишите запрос, который отфильтрует задачи по определённому статусу ('new').
- Для всех полученных задач обновите поле
statusна новое значение 'in_progress'. - У модели вызовите метод, который позволит массово применить обновления.
- Посмотрите результат, выведите поле статуса у всех задач.
Задание 22 — Массовое обновление даты выполнения задач
- Импортируйте модель
Task. - Импортируйте модуль
timedeltaиз библиотекиdatetimeиFкласс. - Получите список задач со статусом 'in_progress'.
- Для каждого полученного объекта измените дату для завершения задачи, увеличив её на +3 дня от той даты, что в задаче указана.
- У модели
Taskвызовите метод, который поможет массово обновить данные.
Задание 23 — Фильтрация проектов по дате создания и количеству файлов
- Импортируйте класс
Countдля подсчёта кол-ва файлов. - Импортируйте модуль
timezoneиз фреймворка django. - Импортируйте модель
Project. - Создайте переменную в которой будет храниться искомая дата проекта, например «2023-07-07».
- Напишите запрос, который будет фильтровать проекты по следующим параметрам:
- Дата создания должна быть больше той даты, что мы получили ранее
- Кол-во файлов для проекта должно быть больше или равно переданному, например трём
Задание 24 — Комбинированная фильтрация задач
- Импортируйте модель
Task. - Импортируйте класс
Qи модульdatetimeиз фреймворка django. - Импортируйте модуль
timezoneиз Django и библиотекуcalendar(базовая). - Напишите функцию, которая будет высчитывать конец месяца от текущей даты.
- Напишите запрос, который будет фильтровать задачи по нескольким условиям:
- Приоритет задачи или «Critical» или «Urgent»
- Дата, когда задача должна быть закрыта (
due_date) — дата конца месяца с текущей даты
Задание 25 — Исключение задач с определенными статусами
- Импортируйте модель
Task. - Импортируйте класс
Q. - Напишите запрос, который будет получать все задачи, кроме тех, что будут переданы в фильтр, например: «pending» и «closed».
Задание 26 — Обновление приоритета задач
- Импортируйте модель
Task. - Импортируйте
Fкласс, модульtimezoneиз фреймворка Django, модульdatetime. - Создайте переменную, где будет храниться определённая дата (месяц назад относительно текущей даты).
- Напишите запрос, который будет получать все задачи из конкретного проекта, например «TIGER», которые были созданы месяц назад.
- Обновите приоритетность таких задач на самую высокую.