Перш ніж заглиблюватися в код, давай розберемося, навіщо взагалі потрібні моделі. Модель у Django — це свого роду міст між твоєю базою даних і Python-кодом. Вона описує структуру даних, що зберігаються в базі, і надає способи взаємодії з цими даними. Під капотом Django ORM (Object-Relational Mapping) перетворює твої моделі на SQL-запити, тим самим позбавляючи тебе необхідності писати купу SQL вручну. Зручно? Безперечно.
Можна сказати, що модель — це креслення або шаблон таблиці в базі даних, де задається структура (поля та їхні типи) і логіка роботи з даними. Кожен екземпляр моделі представляє один рядок у таблиці, а самі поля моделі відповідають колонкам таблиці.
Структура класу моделі в Django
Модель у Django створюється як клас, який наслідується від базового класу models.Model. Ось основна структура:
from django.db import models
class MyModel(models.Model):
# ваші поля тут
pass
Звучить занадто просто? Так і є. Ви просто описуєте поля моделі, і Django сам подбає про створення таблиці під капотом. Але давайте розберемо це більш детально.
Пишемо першу модель: крок за кроком
Створимо просту модель для нашого проєкту. Припустимо, ми робимо застосунок для бібліотеки (нехай це буде наша стартова тема). Нам потрібна модель для зберігання інформації про книги.
Крок 1: Відкриваємо файл models.py
Файл models.py для кожного застосунку (app) використовується для опису моделей. Відкрийте його, і ви побачите, що він вже містить рядок імпорту models.
Крок 2: Створюємо модель Book
У цьому файлі визначимо модель під назвою Book. Вона міститиме три поля: назва книги, автор та дата публікації.
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200) # Назва книги
author = models.CharField(max_length=100) # Ім'я автора
published_date = models.DateField() # Дата публікації
Розберемо код по частинах:
title: поле типуCharField, яке використовується для текстових даних невеликої довжини. Атрибутmax_lengthвказує максимальну кількість символів.author: ще однеCharFieldдля імені автора. Тут також важливо вказатиmax_length.published_date: поле типуDateField, яке використовується для зберігання дати. Чудовий вибір, якщо ваша база даних аналізуватиме дати.
Якщо не вказати max_length у CharField, Django подивиться на вас так само осудливо, як кіт, якого розбудили серед ночі.
Кореляція: модель і база даних
Коли ми створюємо модель, Django автоматично використовує її для формування схеми бази даних. Наприклад, наведена вище модель Book перетвориться на SQL-запит приблизно такого вигляду:
CREATE TABLE library_book (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title VARCHAR(200) NOT NULL,
author VARCHAR(100) NOT NULL,
published_date DATE NOT NULL
);
Зверни увагу, що поле id не було явно вказано в нашій моделі. Django автоматично додає це поле як первинний ключ для кожної моделі.
Практичний приклад: створення моделі користувача
Припустимо, тепер нам потрібно додати модель користувача для нашої бібліотеки. Кожному користувачу потрібно вказувати ім'я, електронну пошту та дату реєстрації. Ось як це буде виглядати:
class User(models.Model):
name = models.CharField(max_length=100) # Ім'я користувача
email = models.EmailField(unique=True) # Унікальний email
registration_date = models.DateTimeField(auto_now_add=True) # Дата реєстрації
EmailField: поле, спеціально розроблене для перевірки формату адреси електронної пошти.unique=True: гарантує, що два користувачі не зможуть зареєструватися з однаковим email.auto_now_add: дляDateTimeFieldце означає, що значення буде автоматично встановлено на поточну дату та час при створенні об'єкта.
auto_now_add підходить для незмінних дат (наприклад, дати реєстрації). Якщо вам потрібно динамічно оновлювати дату (наприклад, дату останнього оновлення), використовуйте auto_now.
Що далі?
Тепер, коли моделі створені, вам потрібно повідомити Django, щоб він додав їх у базу даних. Для цього використовуються міграції.
Створити міграцію (файл, що описує зміни в структурі бази даних):
python manage.py makemigrationsDjango створить файл міграції, який представляє ваші зміни.
Застосувати міграцію (внести зміни у базу даних):
python manage.py migrateТепер таблиці для ваших моделей будуть створені.
Перевіряємо результат
Після створення і застосування міграцій можна переконатися, що таблиці були створені коректно. Є два способи це зробити:
Спосіб 1: Використання Django shell
Відкрийте Django shell:
python manage.py shell
Спробуйте створити об'єкт Book:
from library.models import Book
# Створюємо екземпляр книги
book = Book(title="Гаррі Поттер", author="Дж. К. Роулінг", published_date="1997-06-26")
book.save() # Зберігаємо в базі
# Перевіряємо збереження
print(Book.objects.all())
Вивід повинен показати, що об'єкт був успішно доданий.
Спосіб 2: Перевірка бази даних напряму
Підключіться до вашої бази даних (наприклад, SQLite) і виконайте запит:
SELECT * FROM library_book;
Ви побачите рядок із даними вашої книги.
Які помилки можуть виникнути?
- "table does not exist": якщо ти забув виконати міграції, Django буде сваритися, що таблиця не існує. Завжди запускай
migrate. - Помилка унікальності: поля з
unique=Trueповинні містити унікальні значення. Якщо ти спробуєш створити запис із дубльованим значенням, отримаєш помилку. - "NOT NULL constraint failed": поля без атрибута
null=Trueвимагають обов'язкового значення.
Для чого це потрібно в реальному житті?
Створення моделей дозволяє централізовано керувати всіма аспектами структури бази даних. Якщо одного разу ви вирішите додати нове поле або змінити логіку роботи з даними, вам достатньо буде внести зміни в модель. Django подбає про все інше. Це корисно не лише для розробки, але й для підтримки коду. Наприклад:
- Під час розробки інтернет-магазину моделі допоможуть описати товари, замовлення, користувачів.
- У блозі моделі представляють пости, коментарі, теги.
- А в нашій бібліотеці — книги, авторів і читачів.
Визначення моделей — це стартова точка для всього застосунку.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ