JavaRush /Курси /Модуль 3: Django /Вступ до моделей та їх зв'язку з базою даних

Вступ до моделей та їх зв'язку з базою даних

Модуль 3: Django
Рівень 6 , Лекція 7
Відкрита

У цій лекції ми поговоримо про те, як Django ORM (Object-Relational Mapping) спрощує нам життя, дозволяючи писати Python-код для роботи з базою даних замість написання SQL-запитів. Ви дізнаєтеся, як моделі пов'язуються з таблицями бази даних, які типи полів існують і як ефективно використовувати їх у своїх проєктах.

Модель у Django

Модель у Django — це клас Python, який представляє собою таблицю в базі даних. Кожен атрибут класу (так зване поле моделі) буде відповідати колонці в таблиці бази даних. Django ORM дозволяє нам працювати з цими таблицями, додавати, змінювати або видаляти дані через Python-код, уникаючи написання SQL-запитів вручну.

Ось як це виглядає на простому прикладі:

from django.db import models

class Author(models.Model):
    # Ім'я автора
    name = models.CharField(max_length=100)

    # Електронна пошта автора
    email = models.EmailField(unique=True)

    def __str__(self):
        return self.name

Цей код створює модель Author, яка буде представлена в базі даних як таблиця з наступними колонками:

  • id: первинний ключ (додається автоматично, якщо ви не вказали свій).
  • name: строкове поле з максимальною довжиною 100 символів.
  • email: унікальне поле для зберігання адреси електронної пошти.

Тепер, коли модель створена, давайте розберемося, як вона взаємодіє з базою даних.

Зв'язок моделей та баз даних

Django використовує ORM для взаємодії з базою даних. Кожна модель відображається на таблицю в базі, а її поля — на колонки.

Якщо вищезгадана модель Author буде застосована до бази даних (через процес міграції, про який ми поговоримо далі), то в базі з'явиться таблиця, схожа на цю:

id name email
1 Іван Іванов ivan@example.com
2 Анна Петрова anna@example.com

Django автоматично створює всі таблиці та зв'язки, описані в моделях, а також надає інтерфейс для роботи з ними.

Працювати з ORM зручніше і безпечніше, ніж напряму писати SQL-запити. Django бере на себе більшу частину операційної роботи:

  • Забезпечує незалежність від використовуваної бази даних (SQLite, PostgreSQL, MySQL тощо).
  • Перевіряє цілісність даних.
  • Автоматизує створення та оновлення таблиць.

Типи полів у Django

Кожне поле моделі представляє собою колонку таблиці бази даних. Django надає безліч типів полів для опису даних, які будуть зберігатися в таблиці. Ось найбільш часто використовувані:

Тип поля Опис
CharField Зберігає рядки фіксованої довжини
TextField Зберігає довгі тексти
IntegerField Зберігає цілі числа
FloatField Зберігає числа з плаваючою крапкою
BooleanField Зберігає значення True або False
DateTimeField Зберігає дату і час
EmailField Зберігає рядок, перевіряючи, що вона є коректною email-адресою
ForeignKey Створює зв'язок «один до багатьох» між двома моделями
ManyToManyField Створює зв'язок «багато до багатьох» між моделями

Приклад використання різних типів полів

from django.db import models

class BlogPost(models.Model):
    title = models.CharField(max_length=200)  # Заголовок статті, рядкове поле
    content = models.TextField()  # Основний текст статті
    published = models.BooleanField(default=False)  # Опублікована чи стаття
    pub_date = models.DateTimeField(auto_now_add=True)  # Дата публікації
    views = models.IntegerField(default=0)  # Лічильник переглядів

    def __str__(self):
        return self.title

Тут ми бачимо, як можна використовувати різні типи даних для опису різних характеристик статті в блозі.

Зв'язок моделей з відношеннями

Оскільки моделі зазвичай не ізольовані, вони часто пов'язані одна з одною через відношення. Ось три основних типи відношень у Django:

One-to-One (Один-до-одного)

Використовується, коли один запис у таблиці пов'язаний лише з одним записом іншої таблиці.

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField()

Many-to-One (Багато-до-одного)

Використовується, коли кілька записів з однієї таблиці можуть бути пов'язані з одним записом з іншої таблиці.

class BlogPost(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)

Many-to-Many (Багато-до-багатьох)

Використовується, коли кілька записів з однієї таблиці можуть бути пов'язані з кількома записами іншої таблиці.

class Tag(models.Model):
    name = models.CharField(max_length=50)

class BlogPost(models.Model):
    title = models.CharField(max_length=200)
    tags = models.ManyToManyField(Tag)

Приклади створення моделей

Давайте створимо модель для коментарів до статей блогу. Це дозволить користувачам залишати відгуки на статті.

class Comment(models.Model):
    post = models.ForeignKey(BlogPost, on_delete=models.CASCADE)  # Зв'язок з моделлю BlogPost
    author_name = models.CharField(max_length=100)
    text = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"Коментар від {self.author_name} до {self.post.title}"

Ця модель демонструє використання ForeignKey для зв'язку коментарів з конкретною статтею. Поле on_delete=models.CASCADE вказує, що при видаленні статті всі її коментарі також будуть видалені.

Створення таблиць для моделей: міграції

Щоб зміни в моделях були застосовані до бази даних, необхідно використовувати систему міграцій Django.

Робота з міграціями включає три кроки:

  1. Створення міграції: команда makemigrations.
  2. Застосування міграції: команда migrate.
  3. Перевірка стану бази даних.

Наводимо приклад роботи з міграціями.

Після додавання моделі Comment у файл models.py, виконайте:

python manage.py makemigrations
python manage.py migrate

Перша команда створить файл міграції, який описує зміни в моделі. Друга команда застосує ці зміни до бази даних, створивши таблицю Comment.

Корисні поради щодо роботи з моделями

  • Завжди додавайте метод __str__ у свої моделі. Це робить їх відображення в адмінці та у відладочних повідомленнях більш читабельним.
  • Використовуйте зрозумілі імена полів та моделей. Це спростить написання коду та зробить його більш читабельним.
  • Регулярно виконуйте міграції, щоб зміни в моделях не накопичувались.
  • Якщо ваші дані мають зв'язки, подумайте про правильний вибір типу відношення (ForeignKey, ManyToMany і т.д.).

На цьому етапі у нас є базове розуміння, як створювати моделі та як вони пов'язані з базою даних. Рухаємось далі до того, щоб оживити наш застосунок і почати активно працювати з даними.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ