У цій лекції ми створимо декілька моделей, налаштуємо атрибути, проведемо міграції та будемо активно взаємодіяти з даними через 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.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ