⚡ Все задачи — кратко
- 1: Проекты за текущий месяц —
filter(__month=timezone.now().month)
- 2: Файлы проектов в день недели —
annotate(ExtractWeekDay) + filter(weekday=2)
- 3: Общее количество проектов —
Project.objects.all().count()
- 4: Количество файлов для каждого проекта — цикл +
aggregate(Count)
- 5: Среднее количество задач на проекте —
annotate(Avg('tasks__id'))
- 6: Количество задач для каждого пользователя —
User.objects.annotate(Count).values_list
- 7: Сортировка задач по приоритету и дате —
order_by('priority', 'due_date')
- 8: Пользователи по количеству задач —
annotate + order_by('-count_of_tasks')
- 9: Пагинация задач —
Paginator(tasks, 10), вывести первую страницу
- 10: Первый сериализатор — AllProjectsSerializer (fields: id, name)
- 11: View для всех проектов —
@api_view(['GET']) + JsonResponse
- 12: AllTasksSerializer (fields: id, name, status, priority)
- 13: View для задач — с фильтрацией по query_param project
- 14: TagsSerializer (fields: '__all__')
- 15: View для всех тегов —
@api_view(['GET'])
- 16: View тег по id —
get_tag_by_id(request, tag_id)
- 17: View обновление тега —
@api_view(['PUT'])
- 18: View создание тега —
@api_view(['POST'])
- 19: View удаление тега —
@api_view(['DELETE'])
- 20: TaskInfoSerializer с вложенным TagsSerializer
- 21: View детальная информация о задаче —
get_task_by_id(request, task_id)
Посмотреть решения → | ← К оглавлению урока
Часть 1: Продвинутые ORM-запросы (задачи 1–9)
Задание 1 — Проекты за текущий месяц
- Импортируйте модель
Project.
- Импортируйте модуль
timezone из django.
- Напишите запрос, который выдаст только те проекты, которые были созданы в текущем месяце (месяц брать от даты текущего дня).
- Если есть хоть один проект — выведите информацию:
- Название проекта
- Полная дата его создания
Посмотреть решение →
Задание 2 — Файлы проектов в день недели
- Импортируйте модель
ProjectFile.
- Импортируйте класс
ExtractWeekDay из django.
- Напишите запрос, который будет получать список файлов за определённый день, например понедельник:
- Для выборки конкретного значения по полю даты создания используйте класс
ExtractWeekDay.
- Для упрощения работы с таким значением задайте для него новое, не заявленное в модели поле, например
weekday.
- Проведите фильтрацию по этому новому полю.
- Если файлов не было найдено — выведите сообщение "Empty Data", если был найден хоть один файл — выведите информацию о нём:
- Название файла
- Путь к файлу, где он сохранён
Посмотреть решение →
Задание 3 — Общее количество проектов
- Импортируйте модель
Project.
- Напишите запрос, который будет считать количество всех проектов, которые есть в базе данных.
- Выведите количество всех проектов в консоль.
Посмотреть решение →
Задание 4 — Количество файлов для каждого проекта
- Импортируйте модель
Project.
- Импортируйте класс
Count из django.
- Напишите запрос, который будет считать количество файлов для каждого проекта персонально.
- Выведите информацию о количестве файлов для каждого проекта.
Посмотреть решение →
Задание 5 — Среднее количество задач на каждом проекте
- Импортируйте модель
Project.
- Импортируйте класс
Avg из django.
- Напишите запрос, который сможет для каждого проекта вывести среднее количество задач.
- Выведите полученные данные.
Посмотреть решение →
Задание 6 — Количество задач для каждого пользователя
- Импортируйте модель
User из django.
- Импортируйте класс
Count из django.
- Напишите запрос, который получит из базы данных количество задач для каждого пользователя.
- В запросе укажите, что хотим работать только с конкретными полями:
- Username
- Наше собственно созданное поле
count_of_tasks
- Выведите как результат никнейм разработчика и количество прикреплённых за ним задач.
Посмотреть решение →
Задание 7 — Сортировка задач по приоритету и дате выполнения
- Импортируйте модель
Task.
- Напишите запрос, который сможет отсортировать все задачи по нескольким полям:
- Приоритет задачи
- Дата, к которой задача должна быть выполнена
- Выведите название задачи, приоритет и дату завершения.
Посмотреть решение →
Задание 8 — Сортировка пользователей по количеству задач
- Импортируйте модель
User из django.
- Напишите запрос, который будет сортировать всех пользователей исходя из того, как много у каждого задач.
- Отсортируйте от самого загруженного сотрудника к самому свободному по задачам.
- Конкретизируйте запрос таким образом, чтобы в него включались только поля:
- Выведите все данные в консоль.
Посмотреть решение →
Задание 9 — Пагинация для задач
- Импортируйте модель
Task.
- Импортируйте класс
Paginator.
- Напишите запрос для получения всех задач.
- Реализуйте пагинацию для того, чтобы в рамках одной страницы отображалось ровно 10 задач, не более.
- Выведите данные об этих 10-ти задачах:
- Название
- Статус
- Приоритетность
- Username разработчика
Посмотреть решение →
Часть 2: Django REST Framework — сериализаторы и views (задачи 10–21)
Задание 10 — Первый сериализатор для проектов
- Установите модуль
djangorestframework.
- Добавить этот модуль в файл
requirements.txt.
- Добавить этот модуль в список установленных приложений в файле
settings.py.
- Создать новый пакет
serializers, в котором создать первый файл — projects.
- Импортируйте класс
ModelSerializer.
- Напишите первый сериализатор, который будет обрабатывать поля
id и name для проекта, выдавая общую базу для вывода всех проектов.
Посмотреть решение →
Задание 11 — Первое представление для отображения списка всех проектов
- Импортируйте ранее написанный сериализатор в файл, где будет реализовываться первое представление.
- Импортируйте дополнительные методы и классы:
Request из rest_framework (для типизации объекта запроса)
JsonResponse из django (для возврата и типизации ответов)
Status из rest_framework (для указания статусов ответов)
api_view из rest_framework.decorators (для конкретики обрабатываемых методов)
- Модель
Project (для запросов к таблице проектов в базе данных)
- Напишите функцию, которая будет обрабатывать GET запросы для получения списка всех проектов из базы данных.
- Зарегистрировать эту функцию в списке эндпоинтов в файле
urls.py.
- Проверьте работу готового эндпоинта.
Посмотреть решение →
Задание 12 — Сериализатор для модели задач (Task)
- Создайте новый файл для сериализаторов задач.
- Импортируйте класс
ModelSerializer.
- Напишите сериализатор для модели
Task с полями id, name, status, priority для получения общей информации о задачах.
Посмотреть решение →
Задание 13 — Отображение для получения списка всех задач
- Импортируйте модель
Task.
- Импортируйте написанный ранее сериализатор
AllTasksSerializer.
- Напишите отображение, которое будет выводить JSON данные о всех задачах из базы данных:
- Если при отправке запроса не передавать конкретный проект — выводить все задачи.
- Если был указан конкретный проект, например "TIGER" — выводить только те задачи, которые принадлежат этому проекту.
Посмотреть решение →
Задание 14 — Сериализатор на получение всех тегов
- Создайте новый файл
tags для хранения сериализаторов.
- Импортируйте класс
ModelSerializer.
- Напишите сериализатор для получения всех тегов.
Посмотреть решение →
Задание 15 — Отображение для получения всех тегов
- Импортируйте модель
Tag.
- Импортируйте сериализатор
TagsSerializer.
- Напишите функцию, которая будет отображать список всех тегов в формате JSON.
Посмотреть решение →
Задание 16 — Отображение для получения тега по id
- Напишите отображение с принимаемым аргументом
tag_id.
- Проверьте существование такого тега и если он есть — вернуть информацию о нём.
Посмотреть решение →
Задание 17 — Отображение для обновления информации о теге
- Поставьте в декоратор
api_view() метод для обновления 'PUT'.
- Напишите запрос, который будет получать конкретный тег по id:
- Реализуйте проверку на получение объекта тега. Если объекта нет — выведите соответствующее сообщение.
- Напишите отображение, которое будет принимать из тела запроса новые данные:
- Реализуйте проверку валидации полученных данных.
- Обновите полученный объект тега новыми данными и сохраните его.
Посмотреть решение →
Задание 18 — Представление для создания тега
- Поставьте в декоратор
api_view() метод для создания 'POST'.
- Напишите отображение, которое будет создавать новый объект тега.
- Реализуйте проверку валидации полученных данных.
- Сохраните новый объект в базе данных.
Посмотреть решение →
Задание 19 — Представление для удаления тега
- Поставьте в декоратор
api_view() метод для удаления 'DELETE'.
- Напишите запрос, который будет получать конкретный тег по id.
- Напишите отображение, которое будет удалять полученный объект тега и выводить сообщение об успешном удалении.
Посмотреть решение →
Задание 20 — Подробная информация о задаче (сериализатор)
- Напишите сериализатор
TaskInfoSerializer для получения подробной информации о задаче.
- Поле для тегов должно быть вложенным объектом, которым является уже готовый сериализатор
TagsSerializer.
Посмотреть решение →
Задание 21 — Детальная информация о задаче (view)
- Импортируйте сериализатор
TaskInfoSerializer.
- Напишите функцию с аргументом
task_id для получения детальной информации о задаче:
- Проверьте существование задачи по её id. Если задачи нет — выведите соответствующее сообщение, если задача есть — выведите её содержимое.
Посмотреть решение →