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

21 задача: ORM-запросы (1–9) · сериализаторы (10–12, 14, 20) · views (11, 13, 15–19, 21)

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

  1. 1: Проекты за текущий месяц — filter(__month=timezone.now().month)
  2. 2: Файлы проектов в день недели — annotate(ExtractWeekDay) + filter(weekday=2)
  3. 3: Общее количество проектов — Project.objects.all().count()
  4. 4: Количество файлов для каждого проекта — цикл + aggregate(Count)
  5. 5: Среднее количество задач на проекте — annotate(Avg('tasks__id'))
  6. 6: Количество задач для каждого пользователя — User.objects.annotate(Count).values_list
  7. 7: Сортировка задач по приоритету и дате — order_by('priority', 'due_date')
  8. 8: Пользователи по количеству задач — annotate + order_by('-count_of_tasks')
  9. 9: Пагинация задач — Paginator(tasks, 10), вывести первую страницу
  10. 10: Первый сериализатор — AllProjectsSerializer (fields: id, name)
  11. 11: View для всех проектов — @api_view(['GET']) + JsonResponse
  12. 12: AllTasksSerializer (fields: id, name, status, priority)
  13. 13: View для задач — с фильтрацией по query_param project
  14. 14: TagsSerializer (fields: '__all__')
  15. 15: View для всех тегов — @api_view(['GET'])
  16. 16: View тег по id — get_tag_by_id(request, tag_id)
  17. 17: View обновление тега — @api_view(['PUT'])
  18. 18: View создание тега — @api_view(['POST'])
  19. 19: View удаление тега — @api_view(['DELETE'])
  20. 20: TaskInfoSerializer с вложенным TagsSerializer
  21. 21: View детальная информация о задаче — get_task_by_id(request, task_id)

Посмотреть решения → | ← К оглавлению урока

Часть 1: Продвинутые ORM-запросы (задачи 1–9)

Задание 1 — Проекты за текущий месяц

  1. Импортируйте модель Project.
  2. Импортируйте модуль timezone из django.
  3. Напишите запрос, который выдаст только те проекты, которые были созданы в текущем месяце (месяц брать от даты текущего дня).
  4. Если есть хоть один проект — выведите информацию:
    • Название проекта
    • Полная дата его создания

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

Задание 2 — Файлы проектов в день недели

  1. Импортируйте модель ProjectFile.
  2. Импортируйте класс ExtractWeekDay из django.
  3. Напишите запрос, который будет получать список файлов за определённый день, например понедельник:
    • Для выборки конкретного значения по полю даты создания используйте класс ExtractWeekDay.
    • Для упрощения работы с таким значением задайте для него новое, не заявленное в модели поле, например weekday.
    • Проведите фильтрацию по этому новому полю.
  4. Если файлов не было найдено — выведите сообщение "Empty Data", если был найден хоть один файл — выведите информацию о нём:
    • Название файла
    • Путь к файлу, где он сохранён

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

Задание 3 — Общее количество проектов

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

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

Задание 4 — Количество файлов для каждого проекта

  1. Импортируйте модель Project.
  2. Импортируйте класс Count из django.
  3. Напишите запрос, который будет считать количество файлов для каждого проекта персонально.
  4. Выведите информацию о количестве файлов для каждого проекта.

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

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

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

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

Задание 6 — Количество задач для каждого пользователя

  1. Импортируйте модель User из django.
  2. Импортируйте класс Count из django.
  3. Напишите запрос, который получит из базы данных количество задач для каждого пользователя.
  4. В запросе укажите, что хотим работать только с конкретными полями:
    • Username
    • Наше собственно созданное поле count_of_tasks
  5. Выведите как результат никнейм разработчика и количество прикреплённых за ним задач.

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

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

  1. Импортируйте модель Task.
  2. Напишите запрос, который сможет отсортировать все задачи по нескольким полям:
    • Приоритет задачи
    • Дата, к которой задача должна быть выполнена
  3. Выведите название задачи, приоритет и дату завершения.

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

Задание 8 — Сортировка пользователей по количеству задач

  1. Импортируйте модель User из django.
  2. Напишите запрос, который будет сортировать всех пользователей исходя из того, как много у каждого задач.
  3. Отсортируйте от самого загруженного сотрудника к самому свободному по задачам.
  4. Конкретизируйте запрос таким образом, чтобы в него включались только поля:
    • Username
    • Count_of_tasks
  5. Выведите все данные в консоль.

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

Задание 9 — Пагинация для задач

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

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

Часть 2: Django REST Framework — сериализаторы и views (задачи 10–21)

Задание 10 — Первый сериализатор для проектов

  1. Установите модуль djangorestframework.
  2. Добавить этот модуль в файл requirements.txt.
  3. Добавить этот модуль в список установленных приложений в файле settings.py.
  4. Создать новый пакет serializers, в котором создать первый файл — projects.
  5. Импортируйте класс ModelSerializer.
  6. Напишите первый сериализатор, который будет обрабатывать поля id и name для проекта, выдавая общую базу для вывода всех проектов.

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

Задание 11 — Первое представление для отображения списка всех проектов

  1. Импортируйте ранее написанный сериализатор в файл, где будет реализовываться первое представление.
  2. Импортируйте дополнительные методы и классы:
    • Request из rest_framework (для типизации объекта запроса)
    • JsonResponse из django (для возврата и типизации ответов)
    • Status из rest_framework (для указания статусов ответов)
    • api_view из rest_framework.decorators (для конкретики обрабатываемых методов)
    • Модель Project (для запросов к таблице проектов в базе данных)
  3. Напишите функцию, которая будет обрабатывать GET запросы для получения списка всех проектов из базы данных.
  4. Зарегистрировать эту функцию в списке эндпоинтов в файле urls.py.
  5. Проверьте работу готового эндпоинта.

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

Задание 12 — Сериализатор для модели задач (Task)

  1. Создайте новый файл для сериализаторов задач.
  2. Импортируйте класс ModelSerializer.
  3. Напишите сериализатор для модели Task с полями id, name, status, priority для получения общей информации о задачах.

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

Задание 13 — Отображение для получения списка всех задач

  1. Импортируйте модель Task.
  2. Импортируйте написанный ранее сериализатор AllTasksSerializer.
  3. Напишите отображение, которое будет выводить JSON данные о всех задачах из базы данных:
    • Если при отправке запроса не передавать конкретный проект — выводить все задачи.
    • Если был указан конкретный проект, например "TIGER" — выводить только те задачи, которые принадлежат этому проекту.

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

Задание 14 — Сериализатор на получение всех тегов

  1. Создайте новый файл tags для хранения сериализаторов.
  2. Импортируйте класс ModelSerializer.
  3. Напишите сериализатор для получения всех тегов.

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

Задание 15 — Отображение для получения всех тегов

  1. Импортируйте модель Tag.
  2. Импортируйте сериализатор TagsSerializer.
  3. Напишите функцию, которая будет отображать список всех тегов в формате JSON.

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

Задание 16 — Отображение для получения тега по id

  1. Напишите отображение с принимаемым аргументом tag_id.
  2. Проверьте существование такого тега и если он есть — вернуть информацию о нём.

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

Задание 17 — Отображение для обновления информации о теге

  1. Поставьте в декоратор api_view() метод для обновления 'PUT'.
  2. Напишите запрос, который будет получать конкретный тег по id:
    • Реализуйте проверку на получение объекта тега. Если объекта нет — выведите соответствующее сообщение.
  3. Напишите отображение, которое будет принимать из тела запроса новые данные:
    • Реализуйте проверку валидации полученных данных.
  4. Обновите полученный объект тега новыми данными и сохраните его.

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

Задание 18 — Представление для создания тега

  1. Поставьте в декоратор api_view() метод для создания 'POST'.
  2. Напишите отображение, которое будет создавать новый объект тега.
    • Реализуйте проверку валидации полученных данных.
  3. Сохраните новый объект в базе данных.

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

Задание 19 — Представление для удаления тега

  1. Поставьте в декоратор api_view() метод для удаления 'DELETE'.
  2. Напишите запрос, который будет получать конкретный тег по id.
  3. Напишите отображение, которое будет удалять полученный объект тега и выводить сообщение об успешном удалении.

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

Задание 20 — Подробная информация о задаче (сериализатор)

  1. Напишите сериализатор TaskInfoSerializer для получения подробной информации о задаче.
  2. Поле для тегов должно быть вложенным объектом, которым является уже готовый сериализатор TagsSerializer.

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

Задание 21 — Детальная информация о задаче (view)

  1. Импортируйте сериализатор TaskInfoSerializer.
  2. Напишите функцию с аргументом task_id для получения детальной информации о задаче:
    • Проверьте существование задачи по её id. Если задачи нет — выведите соответствующее сообщение, если задача есть — выведите её содержимое.

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

Посмотреть все решения → | ← К оглавлению урока