Это закрепляющее задание — не LMS-ДЗ.
В источнике практикума (Adpractice_Pr3) отдельного домашнего задания нет. Предложенное ниже задание создано для самостоятельного закрепления навыков урока 21.
В источнике практикума (Adpractice_Pr3) отдельного домашнего задания нет. Предложенное ниже задание создано для самостоятельного закрепления навыков урока 21.
Задание: система учёта книг
Создайте небольшой Django-проект с тремя моделями и напишите серию ORM-запросов в Django shell.
Модели
# models.py
from django.db import models
class Genre(models.Model):
name = models.CharField(max_length=50, unique=True)
def __str__(self):
return self.name
class Author(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
email = models.EmailField(unique=True)
def __str__(self):
return f"{self.first_name} {self.last_name}"
class Book(models.Model):
STATUS_CHOICES = [
('available', 'Available'),
('borrowed', 'Borrowed'),
('lost', 'Lost'),
]
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.PROTECT, related_name='books')
genres = models.ManyToManyField(Genre, related_name='books', blank=True)
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='available')
year = models.IntegerField()
added_at = models.DateTimeField(auto_now_add=True)
copies = models.PositiveSmallIntegerField(default=1)
def __str__(self):
return self.title
Задачи
- Создайте данные в Django shell:
- 3 жанра: Fiction, Non-Fiction, Science
- 3 автора с разными email
- 6 книг (по 2 на автора), связать каждую с 1–2 жанрами через
.add()
- Базовые запросы:
- Получить все книги, вывести title каждой
- Проверить наличие книги «Несуществующая книга» через
.exists()
- Фильтрация с lookups:
- Найти книги, у которых status = 'available' и year > 2000
- Найти книги, у которых в title есть слово (icontains)
- Q-класс: найти книги со статусом 'borrowed' ИЛИ с copies = 0
- F-класс: увеличить copies для всех книг жанра Fiction на 1 через
.update(copies=F('copies') + 1) - bulk_update: получить книги со статусом 'available', для каждой изменить статус на 'borrowed', применить bulk_update
- annotate(Count): аннотировать каждого автора количеством книг, вывести авторов у которых книг >= 2
- exclude() + Q: получить все книги кроме 'lost' и 'borrowed'
Подготовка окружения
# 1. Создать виртуальное окружение
python -m venv venv
# 2. Активировать (Windows PowerShell)
.\venv\Scripts\Activate.ps1
# 3. Установить Django
pip install django
# 4. Создать проект и приложение
django-admin startproject library .
python manage.py startapp catalog
# 5. Добавить 'catalog' в INSTALLED_APPS (settings.py)
# 6. Создать models.py с тремя моделями (код выше)
# 7. Применить миграции
python manage.py makemigrations
python manage.py migrate
# 8. Запустить shell
python manage.py shell
Проверка в VS Code
Терминал
- Открыть встроенный терминал:
Ctrl+` - Убедиться, что активировано venv (в начале строки
(venv)) - Запустить
python manage.py shellи выполнить запросы
launch.json для Django shell
{
"version": "0.2.0",
"configurations": [
{
"name": "Django shell",
"type": "debugpy",
"request": "launch",
"program": "${workspaceFolder}/manage.py",
"args": ["shell"],
"django": true,
"justMyCode": true
}
]
}
Связь с разделами урока
- Методы создания объектов — Теория: QuerySet API
- Q/F-классы — Теория: Q-класс, F-класс
- bulk_update — Примеры: Пример 6
- annotate(Count) — Примеры: Пример 7