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.
3
Опитування
Робота з базою даних через shell, рівень 7, лекція 9
Недоступний
Робота з базою даних через shell
Робота з базою даних через shell
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ