В этой лекции мы оздадим несколько моделей, настроим атрибуты, проведем миграции и будем активно взаимодействовать с данными через 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
Что здесь происходит?
- Мы определили три модели:
Author,BookиReader. - Используем разные типы полей:
CharFieldдля текстовых данных.DateFieldдля хранения дат.ForeignKeyдля создания связи междуBookиAuthor.EmailFieldдля уникальных email-адресов.
- Добавили атрибуты (
choices,default,unique,null,blank), чтобы гибче настроить поля. - Реализовали метод
__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()
Практическое задание
Для закрепления материала сделайте следующее:
- Создайте еще несколько авторов, книг и читателей.
- Напишите SQL-запросы в Django shell, чтобы:
- Найти книги определенного жанра.
- Найти всех читателей, которые зарегистрировались после определенной даты.
- Попробуйте изменить модель
Book, добавив новое полеdescription(описание книги), создайте новую миграцию и примените ее. - Проверьте, работает ли поле
descriptionчерез Django shell.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ