JavaRush /Курсы /Модуль 3: Django /Практика работы с моделями и миграциями

Практика работы с моделями и миграциями

Модуль 3: Django
7 уровень , 9 лекция
Открыта

В этой лекции мы оздадим несколько моделей, настроим атрибуты, проведем миграции и будем активно взаимодействовать с данными через Django shell.

Создаем модели для нашего приложения

Итак, представим, что мы разрабатываем платформу для управления библиотекой. В нашей системе будут такие сущности, как книги, авторы и читатели. Создадим соответствующие модели.

Открываем файл models.py в вашем приложении, например, "library", и добавляем:

from django.db import models


# Модель для авторов книг
class Author(models.Model):
    name = models.CharField(max_length=100)  # Имя автора
    birth_date = models.DateField(null=True, blank=True)  # Дата рождения (опционально)
    nationality = models.CharField(max_length=50, null=True, blank=True)  # Национальность

    def __str__(self):
        return self.name


# Модель для книг
class Book(models.Model):
    title = models.CharField(max_length=200)  # Название книги
    author = models.ForeignKey(Author, on_delete=models.CASCADE)  # Связь с автором
    published_date = models.DateField()  # Дата публикации
    genre = models.CharField(max_length=50, choices=[
        ('fiction', 'Fiction'),
        ('nonfiction', 'Non-Fiction'),
        ('fantasy', 'Fantasy'),
        ('biography', 'Biography'),
    ])  # Жанр
    available_copies = models.IntegerField(default=1)  # Количество доступных копий

    def __str__(self):
        return self.title


# Модель для читателей
class Reader(models.Model):
    name = models.CharField(max_length=100)  # Имя читателя
    email = models.EmailField(unique=True)  # Email (должен быть уникальным)
    registered_date = models.DateField(auto_now_add=True)  # Дата регистрации (автоматически добавляется)

    def __str__(self):
        return self.name

Что здесь происходит?

  1. Мы определили три модели: Author, Book и Reader.
  2. Используем разные типы полей:
    • CharField для текстовых данных.
    • DateField для хранения дат.
    • ForeignKey для создания связи между Book и Author.
    • EmailField для уникальных email-адресов.
  3. Добавили атрибуты (choices, default, unique, null, blank), чтобы гибче настроить поля.
  4. Реализовали метод __str__, чтобы представлять объекты моделей удобным текстовым способом.

Создаем и применяем миграции

Теперь, когда наши модели готовы, нужно сообщить об этом Django. Сначала создадим файл миграции, а затем применим его к базе данных.

Создадим файл миграции. Для этого выполняем команду в терминале:

python manage.py makemigrations

Django проанализирует изменения в моделях и создаст файл миграции. Вот пример вывода:

Migrations for 'library':
  library/migrations/0001_initial.py
    - Create model Author
    - Create model Book
    - Create model Reader

Теперь применим миграции к базе данных:

python manage.py migrate

Вывод (сокращенный):

Applying library.0001_initial... OK

Теперь наша база данных знает о наших новых моделях, и таблицы для Author, Book и Reader созданы.

Наполняем базу данных через Django shell

Открываем Django shell для работы с моделями:

python manage.py shell

Импортируем наши модели:

from library.models import Author, Book, Reader

Создадим пару авторов:

# Создаем объект автора
author1 = Author.objects.create(name="Джоан Роулинг", birth_date="1965-07-31", nationality="British")
author2 = Author.objects.create(name="Джордж Оруэлл", birth_date="1903-06-25", nationality="British")

Теперь добавим книги для этих авторов:

# Книга от Джоан Роулинг
Book.objects.create(
    title="Гарри Поттер и философский камень",
    author=author1,
    published_date="1997-06-26",
    genre="fantasy",
    available_copies=5
)

# Книга от Джорджа Оруэлла
Book.objects.create(
    title="1984",
    author=author2,
    published_date="1949-06-08",
    genre="fiction",
    available_copies=3
)

Добавим нескольких читателей:

Reader.objects.create(name="Иван Иванов", email="ivan@example.com")
Reader.objects.create(name="Мария Петрова", email="maria@example.com")

Проверяем данные в базе

Мы можем убедиться, что данные успешно созданы, выполнив выборки в Django shell.

Просмотреть всех авторов:

authors = Author.objects.all()
for author in authors:
    print(author.name, author.nationality)

Найти книги определенного автора:

books_by_rowling = Book.objects.filter(author=author1)
for book in books_by_rowling:
    print(book.title, book.genre)

Найти всех читателей:

readers = Reader.objects.all()
for reader in readers:
    print(reader.name, reader.email)

Обновление и удаление записей

Допустим, у нас стало больше копий книги "1984". Обновим это значение:

book = Book.objects.get(title="1984")
book.available_copies = 10
book.save()

Если мы удалим автора, все его книги также будут удалены благодаря on_delete=models.CASCADE.

author2.delete()

Практическое задание

Для закрепления материала сделайте следующее:

  1. Создайте еще несколько авторов, книг и читателей.
  2. Напишите SQL-запросы в Django shell, чтобы:
    • Найти книги определенного жанра.
    • Найти всех читателей, которые зарегистрировались после определенной даты.
  3. Попробуйте изменить модель Book, добавив новое поле description (описание книги), создайте новую миграцию и примените ее.
  4. Проверьте, работает ли поле description через Django shell.
1
Задача
Модуль 3: Django, 7 уровень, 9 лекция
Недоступна
Работа с Django Shell
Работа с Django Shell
1
Задача
Модуль 3: Django, 7 уровень, 9 лекция
Недоступна
Изменение модели и повторные миграции
Изменение модели и повторные миграции
3
Опрос
Работа с базой данных через shell, 7 уровень, 9 лекция
Недоступен
Работа с базой данных через shell
Работа с базой данных через shell
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Артём Васенин Уровень 82
10 августа 2025
Последняя задача в PyCharm не прошла тестирование а потом на сайте уже прошла. С одними и теми же входными данными - разный результат. Тестам ноль доверия
Евгений Уровень 82
22 августа 2025
Прошла успешно в PyCharm после удаления базы данных.
Андрей Уровень 60
27 июля 2025
Прошу определится, Мы по лекциям делаем то БЛОГ , то Библиотеку....прошу выбрать что то одно чтобы работать с этим проектом и практиковаться, параллельно в PyCharm