У цій лекції ми поговоримо про те, як 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 | |
|---|---|---|
| 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.
Робота з міграціями включає три кроки:
- Створення міграції: команда
makemigrations. - Застосування міграції: команда
migrate. - Перевірка стану бази даних.
Наводимо приклад роботи з міграціями.
Після додавання моделі Comment у файл models.py, виконайте:
python manage.py makemigrations
python manage.py migrate
Перша команда створить файл міграції, який описує зміни в моделі. Друга команда застосує ці зміни до бази даних, створивши таблицю Comment.
Корисні поради щодо роботи з моделями
- Завжди додавайте метод
__str__у свої моделі. Це робить їх відображення в адмінці та у відладочних повідомленнях більш читабельним. - Використовуйте зрозумілі імена полів та моделей. Це спростить написання коду та зробить його більш читабельним.
- Регулярно виконуйте міграції, щоб зміни в моделях не накопичувались.
- Якщо ваші дані мають зв'язки, подумайте про правильний вибір типу відношення (ForeignKey, ManyToMany і т.д.).
На цьому етапі у нас є базове розуміння, як створювати моделі та як вони пов'язані з базою даних. Рухаємось далі до того, щоб оживити наш застосунок і почати активно працювати з даними.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ