📝 Практикум 3: задачи

26 задач: создание данных (1–6) · запросы (7–12) · фильтрация (13–20) · массовые операции (21–26)

⚡ Все задачи — кратко

  1. 1: Django shell → создать 5 тэгов (Backend, Frontend, Q&A, Design, DevOPS) → save()
  2. 2: Создать 2 проекта (TIGER, SapHYR INC) через objects и save()/create()
  3. 3: Создать ProjectFile для каждого проекта → привязать через add()
  4. 4: Создать 5 пользователей (backend_dev, frontend_dev, designer, devops, qa_dev)
  5. 5: Для каждого проекта создать задачи (Task) с FK на проект и исполнителя
  6. 6: Добавить тэги к задачам через M2M .add()
  7. 7: all(), first(), last(), count() для Tag
  8. 8: filter().exists() — проверить наличие тэга
  9. 9: filter(name__icontains='e') — фильтрация тэгов по строке
  10. 10: filter(date_of_creation__gt=req_date) — проекты по дате
  11. 11: Q-класс: дата AND имя__icontains
  12. 12: filter(project__name__contains='TIGER') — файлы через связь
  13. 13: filter(status='new', priority='Urgent') — вывести детали задач
  14. 14: filter().update(status='pending')
  15. 15: Q: (status='new' AND priority='Urgent') OR NOT tags__name='Q&A'
  16. 16: F-класс: filter(due_date__month=...).update(priority='Critical')
  17. 17: update(due_date=F('due_date') + timedelta(weeks=1))
  18. 18: filter(assignee__isnull=True)
  19. 19: filter(tags__name__icontains='Q&A') — задачи через тэг
  20. 20: ProjectFile за последнюю неделю → проекты через project_files__in
  21. 21: bulk_update статуса 'new' → 'in_progress'
  22. 22: bulk_update due_date += 3 дня для status='in_progress'
  23. 23: annotate(Count) → filter по дате и file_count
  24. 24: Функция конца месяца → filter Q(priority) & due_date__lte
  25. 25: exclude(Q(status='pending') | Q(status='closed'))
  26. 26: filter по проекту и created_date__lt → update(priority='Urgent')

Решения →

Перед началом: все задачи выполняются в Django shell (python manage.py shell). Задачи 1–6 создают данные, задачи 7–26 — работают с ними. Выполняйте последовательно в одной сессии shell.

Блок 1: Создание данных (задачи 1–6)

Задание 1 — Создание тэгов для будущих задач

  1. Зайдите в Django shell консоль.
  2. Импортируйте модель Tag.
  3. Создайте объекты тэгов по направлениям:
    • Backend
    • Frontend
    • Q&A
    • Design
    • DevOPS
  4. Сохраните изменения в базу данных.

Посмотреть решение →

Задание 2 — Создание проектов

  1. Импортируйте необходимый(е) классы для работы.
  2. Создайте несколько объектов проекта, используя менеджер objects у модели.
  3. Убедитесь, что данные были успешно записаны в базу данных.

Посмотреть решение →

Задание 3 — Добавление файлов к проектам

  1. Импортируйте модели Project, ProjectFile.
  2. Создайте несколько записей файлов для каждого из существующих проектов.
  3. Для каждого объекта проекта, созданного ранее, добавьте объекты созданных файлов методом add().
  4. Убедитесь, что данные были созданы и сохранены в базу данных.

Посмотреть решение →

Задание 4 — Создание пользователей для работы в проекте

  1. Импортируйте модель Пользователя (User), которого по умолчанию предлагает Django.
  2. Создайте пять разных пользователей:
    • Backend
    • Frontend
    • DevOPS
    • Q&A
    • Designer
  3. Убедитесь, что все они сохранены в базу данных.

Посмотреть решение →

Задание 5 — Создание задач для проектов

  1. Импортируйте модель Task.
  2. Для каждого проекта создайте задачи. По одной-две для каждого тега.
  3. Для foreignkey полей передаём объекты, которые мы создавали ранее.
  4. Убедитесь, что данные были созданы и сохранены в базу данных.

Посмотреть решение →

Задание 6 — Добавление тэгов для всех задач

  1. Получите все объекты тегов.
  2. У каждого объекта созданных задач обратитесь к полю тегов через точку.
  3. У поля ManyToMany (tags) вызовите метод add и передайте ему объект тега.
    • Объект тега будет зависеть от того, какой title будет в задаче, например: ('Добавить новый эндпоинт' — Backend tag, 'Обновить страницу ответа 404' — Frontend tag)

Посмотреть решение →

Блок 2: Базовые запросы (задачи 7–12)

Задание 7 — Получение тегов

  1. Импортируйте модели тегов Tag.
  2. Напишите запрос, который позволит получить список всех тегов.
  3. Выведите имя каждого тега.
  4. Получите самый первый тег.
  5. Получите самый последний тег.
  6. Получите кол-во всех тегов.

Посмотреть решение →

Задание 8 — Проверка существования тега с именем

  1. Напишите запрос, который будет искать тэг по определённому имени.
  2. Проверьте наличие такого тега методом, который выдаёт True или False на наличие объекта.

Посмотреть решение →

Задание 9 — Фильтрация тегов по имени

  1. Напишите запрос, который позволит получить теги, у которых в имени будет совпадение по переданной строке, например: «...Tag»
  2. Выведите имена всех этих тегов.

Посмотреть решение →

Задание 10 — Фильтрация проектов по дате создания

  1. Импортируйте модуль datetime и модель Project.
  2. Создайте объект даты, по которой нужно сделать поиск.
  3. Напишите запрос, который позволит получить список проектов, которые равны или старше переданной даты создания.
  4. Выведите имена таких проектов.

Посмотреть решение →

Задание 11 — Использование Q-класса для комбинированных условий

  1. Импортируйте модель Project.
  2. Напишите запрос, который позволит получить необходимые проекты:
    • Реализуйте фильтрацию, которая будет проходить два условия:
      • Проекты, равные или больше указанной даты
      • Проекты, у которых в имени есть строка 'TI'
  3. Выведите имена таких проектов.

Посмотреть решение →

Задание 12 — Получение списка всех файлов для проекта

  1. Напишите запрос, который позволит получить список всех файлов, которые привязаны к конкретному проекту. Поиск произведите по имени проекта.
  2. Выведите только пути к каждому файлу.

Посмотреть решение →

Блок 3: Продвинутая фильтрация (задачи 13–20)

Задание 13 — Фильтрация задач по статусу и приоритету

  1. Напишите запрос, который поможет получить только те задачи, у которых:
    • Статус «new»
    • Приоритетность «Urgent»
  2. Выведите информацию по каждой такой задаче:
    • Название
    • Статус
    • Приоритетность
    • Дата, когда задача должна быть сдана
    • Email сотрудника, за которым закреплена эта задача

Посмотреть решение →

Задание 14 — Обновление статуса задачи

  1. Напишите запрос, который поможет получить конкретную задачу.
  2. Обратитесь к полю статуса и обновите его на новое значение, например «pending». Сделайте это через метод update().

Посмотреть решение →

Задание 15 — Получение задач через комбинацию условий

  1. Напишите запрос, который будет содержать в себе прохождение одной из комбинаций:
    • статус и приоритетность
    • прохождение несовпадения по тегу
  2. Выведите название этих задач, проект и email разработчиков.

Посмотреть решение →

Задание 16 — Обновление приоритета задач

  1. Импортируйте модель Task.
  2. Импортируйте F класс.
  3. Обновите приоритет задач, которые должны быть выполнены в следующем месяце, на «Critical». Используйте F-класс.

Посмотреть решение →

Задание 17 — Увеличение даты выполнения всех задач на неделю

  1. Импортируйте модуль timedelta из библиотеки datetime.
  2. Импортируйте модель Task.
  3. Обновите все объекты задач по полю due_date на +1 неделю. Используйте F-класс.

Посмотреть решение →

Задание 18 — Фильтрация задач, у которых нет прикрепленного разработчика

  1. Импортируйте модель Task.
  2. Напишите запрос, который поможет профильтровать по lookups-полю те задачи, у которых нет назначенного разработчика.
  3. Выведите название таких задач и название проекта для этих задач.

Посмотреть решение →

Задание 19 — Получение задач

Необходимо получить все задачи, связанные с тэгами и содержащими определённое ключевое слово.

  1. Импортируйте модель Task.
  2. Напишите запрос, который поможет отфильтровать задачи через конкретный тэг.
    • Запрос должен быть написан с использованием lookups-полей
    • Запрос должен начинаться с модели Task, через эту модель нужно получить доступ к конкретному тэгу
  3. Выведите информацию по каждой задаче:
    • Имя задачи
    • Статус задачи
    • Приоритет задачи
    • Имя проекта этой задачи

Посмотреть решение →

Задание 20 — Получение проектов

Необходимо получить все проекты, связанные с файлами, созданными в определенный период (последняя неделя).

  1. Импортируйте модели Project, ProjectFile.
  2. Создайте переменную с датой периода создания файлов (от текущего дня −7 дней).
  3. Напишите первый запрос, который поможет получить те файлы, которые должны быть больше или равны полученной дате по полю создания этого файла.
  4. Напишите запрос, который поможет получить только те проекты, у которых есть те файлы, что мы получили предыдущим запросом.
  5. Выведите информацию об этих проектах: имя проекта и дата создания.

Посмотреть решение →

Блок 4: Массовые операции и агрегация (задачи 21–26)

Задание 21 — Массовое обновление статуса задач

  1. Импортируйте модель Task.
  2. Напишите запрос, который отфильтрует задачи по определённому статусу ('new').
  3. Для всех полученных задач обновите поле status на новое значение 'in_progress'.
  4. У модели вызовите метод, который позволит массово применить обновления.
  5. Посмотрите результат, выведите поле статуса у всех задач.

Посмотреть решение →

Задание 22 — Массовое обновление даты выполнения задач

  1. Импортируйте модель Task.
  2. Импортируйте модуль timedelta из библиотеки datetime и F класс.
  3. Получите список задач со статусом 'in_progress'.
  4. Для каждого полученного объекта измените дату для завершения задачи, увеличив её на +3 дня от той даты, что в задаче указана.
  5. У модели Task вызовите метод, который поможет массово обновить данные.

Посмотреть решение →

Задание 23 — Фильтрация проектов по дате создания и количеству файлов

  1. Импортируйте класс Count для подсчёта кол-ва файлов.
  2. Импортируйте модуль timezone из фреймворка django.
  3. Импортируйте модель Project.
  4. Создайте переменную в которой будет храниться искомая дата проекта, например «2023-07-07».
  5. Напишите запрос, который будет фильтровать проекты по следующим параметрам:
    • Дата создания должна быть больше той даты, что мы получили ранее
    • Кол-во файлов для проекта должно быть больше или равно переданному, например трём

Посмотреть решение →

Задание 24 — Комбинированная фильтрация задач

  1. Импортируйте модель Task.
  2. Импортируйте класс Q и модуль datetime из фреймворка django.
  3. Импортируйте модуль timezone из Django и библиотеку calendar (базовая).
  4. Напишите функцию, которая будет высчитывать конец месяца от текущей даты.
  5. Напишите запрос, который будет фильтровать задачи по нескольким условиям:
    • Приоритет задачи или «Critical» или «Urgent»
    • Дата, когда задача должна быть закрыта (due_date) — дата конца месяца с текущей даты

Посмотреть решение →

Задание 25 — Исключение задач с определенными статусами

  1. Импортируйте модель Task.
  2. Импортируйте класс Q.
  3. Напишите запрос, который будет получать все задачи, кроме тех, что будут переданы в фильтр, например: «pending» и «closed».

Посмотреть решение →

Задание 26 — Обновление приоритета задач

  1. Импортируйте модель Task.
  2. Импортируйте F класс, модуль timezone из фреймворка Django, модуль datetime.
  3. Создайте переменную, где будет храниться определённая дата (месяц назад относительно текущей даты).
  4. Напишите запрос, который будет получать все задачи из конкретного проекта, например «TIGER», которые были созданы месяц назад.
  5. Обновите приоритетность таких задач на самую высокую.

Посмотреть решение →

Перейти к решениям →

← К оглавлению урока