📝 Практикум 4: задачи
⚡ Все задачи — кратко
- 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. - Напишите запрос, который будет сортировать всех пользователей исходя из того, как много у каждого задач.
- Отсортируйте от самого загруженного сотрудника к самому свободному по задачам.
- Конкретизируйте запрос таким образом, чтобы в него включались только поля:
- Username
- Count_of_tasks
- Выведите все данные в консоль.
Задание 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. Если задачи нет — выведите соответствующее сообщение, если задача есть — выведите её содержимое.
Проверка понимания
Выберите один вариант ответа. После клика правильный ответ подсветится зелёным.
Вопрос 1
Что важнее всего в практическом задании?
Вопрос 2
Как безопаснее двигаться в практикуме?
Вопрос 3
Что делать, если решение не совпадает с ожидаемым результатом?
Вопрос 4
Что описывает Django model?
Вопрос 5
Что такое QuerySet?
Вопрос 6
Что такое SSH?