🏠 Домашнее задание: ORM-запросы

⚡ Задание кратко

Создайте систему учёта книг (Book, Author, Genre) и напишите 8 ORM-запросов: фильтрация, Q/F-классы, bulk_update, annotate(Count).

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

Это закрепляющее задание — не LMS-ДЗ.
В источнике практикума (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

Задачи

  1. Создайте данные в Django shell:
    • 3 жанра: Fiction, Non-Fiction, Science
    • 3 автора с разными email
    • 6 книг (по 2 на автора), связать каждую с 1–2 жанрами через .add()
  2. Базовые запросы:
    • Получить все книги, вывести title каждой
    • Проверить наличие книги «Несуществующая книга» через .exists()
  3. Фильтрация с lookups:
    • Найти книги, у которых status = 'available' и year > 2000
    • Найти книги, у которых в title есть слово (icontains)
  4. Q-класс: найти книги со статусом 'borrowed' ИЛИ с copies = 0
  5. F-класс: увеличить copies для всех книг жанра Fiction на 1 через .update(copies=F('copies') + 1)
  6. bulk_update: получить книги со статусом 'available', для каждой изменить статус на 'borrowed', применить bulk_update
  7. annotate(Count): аннотировать каждого автора количеством книг, вывести авторов у которых книг >= 2
  8. 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

Терминал

  1. Открыть встроенный терминал: Ctrl+`
  2. Убедиться, что активировано venv (в начале строки (venv))
  3. Запустить 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
        }
    ]
}

Связь с разделами урока

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