Якщо ти тільки почав працювати з Django, то, ймовірно, задаєшся питанням: "Чому просто вказівки типу поля недостатньо? Який сенс у цих додаткових атрибутах?". Чудове питання! Давай подивимось на аналогію: уяви, що ти відкриваєш банківський рахунок. Рахунок — це "поле", але є додаткові налаштування: обмеження на кількість коштів, валюта рахунку, мінімальна сума поповнення.
У Django атрибути полів потрібні, щоб:
- Керувати обмеженнями на введені дані.
- Задавати значення за замовчуванням (щоб база не "сварилася", якщо дані не вказані).
- Робити поле обов'язковим чи необов'язковим.
- Вказувати довжину для текстових даних або діапазон для чисел.
- І, звісно, підвищувати читабельність коду та його стійкість до помилок.
Основні атрибути полів та їх налаштування
Тепер перейдемо до "смачного" — це список часто використовуваних атрибутів і приклади їх застосування. Щоб не бути голослівними, ми будемо використовувати просту модель, наприклад, для зберігання даних про книги.
1. max_length (актуально для текстових полів)
Вказує, скільки символів максимально можна зберігати в полі. Використовується, наприклад, для CharField і TextField.
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100) # Максимум 100 символів
description = models.TextField() # У TextField max_length не обов'язковий
Якщо ви спробуєте зберегти рядок довжиною > 100 символів у полі title, отримаєте помилку. А тепер уявіть, що поле max_length — це межа вашої чашки кави. Без цієї "межі" кава почне розливатися.
2. default (значення за замовчуванням)
Вказує значення, яке буде присвоєне полю, якщо його не вказали вручну.
class Book(models.Model):
title = models.CharField(max_length=100)
is_published = models.BooleanField(default=False) # За замовчуванням книга не опублікована
Якщо ви створите книгу без зазначення is_published, то вона автоматично отримає значення False. Це як "за замовчуванням чай без цукру", поки ви самі не попросите інакше.
3. null (чи можна зберігати порожнє значення в базі)
Задає налаштування на рівні бази даних. Якщо null=True, то колонка в таблиці бази даних зможе містити NULL.
class Book(models.Model):
title = models.CharField(max_length=100, null=False) # Обов'язкове поле в базі
summary = models.TextField(null=True) # Можна залишити порожнім
Але важливо розуміти, що null=True і порожній рядок ('') — це різні речі. null — це відсутність значення в базі, а '' — це значення.
4. blank (чи можна залишити поле порожнім у формах)
Опція, що стосується форм Django. Якщо blank=True, то поле можна не заповнювати у формах.
class Book(models.Model):
title = models.CharField(max_length=100, blank=False) # Заголовок обов'язковий у формах
summary = models.TextField(blank=True) # У формі можна залишити порожнім
Порада: зазвичай null=True і blank=True ставляться разом. Але для текстових полів це правило не завжди обов'язкове.
5. choices (обмеження можливих значень)
Дозволяє створити фіксований набір значень для поля. Наприклад:
class Book(models.Model):
GENRE_CHOICES = [
('fiction', 'Fiction'),
('nonfiction', 'Non-Fiction'),
('mystery', 'Mystery'),
]
genre = models.CharField(max_length=50, choices=GENRE_CHOICES, default='fiction')
Тепер користувачі зможуть вибрати лише один із зазначених жанрів. Django навіть автоматично підставить випадаючий список в адмінці. Це як вибрати булочку до супу в їдальні — варіантів небагато, але все під контролем.
6. unique (унікальність поля)
Гарантує, що значення в цьому полі буде унікальним на рівні бази.
class Book(models.Model):
title = models.CharField(max_length=100)
isbn = models.CharField(max_length=13, unique=True) # ISBN має бути унікальним
Якщо ви спробуєте створити дві книги з однаковим isbn, отримаєте помилку. Це ідеальний спосіб запобігти дублюванню даних.
7. verbose_name і help_text (краса і допомога)
verbose_name: людино-зрозуміла назва для поля (наприклад, для форми чи адмінки).help_text: короткий опис, щоб допомогти користувачу заповнити поле.
class Book(models.Model):
title = models.CharField(
max_length=100,
verbose_name="Назва книги",
help_text="Введіть повну назву книги"
)
pages = models.IntegerField(
verbose_name="Кількість сторінок",
help_text="Кількість сторінок має бути більше 0"
)
Якщо ви створюєте форму на основі цієї моделі, verbose_name буде відображатися як "Назва книги". А help_text підкаже користувачу, що поле не таке вже й складне.
Повний приклад моделі
Давай об'єднаємо всі атрибути, які ми щойно розглянули, в одному прикладі. У нас вийде наступний клас:
from django.db import models
class Book(models.Model):
GENRE_CHOICES = [
('fiction', 'Fiction'),
('nonfiction', 'Non-Fiction'),
('mystery', 'Mystery'),
]
title = models.CharField(
max_length=150,
verbose_name="Назва книги",
help_text="Введіть назву книги"
)
description = models.TextField(blank=True, null=True)
genre = models.CharField(
max_length=50,
choices=GENRE_CHOICES,
default='fiction'
)
isbn = models.CharField(max_length=13, unique=True)
is_published = models.BooleanField(default=False)
pages = models.PositiveIntegerField(
verbose_name="Кількість сторінок",
help_text="Будь ласка, вкажіть додатнє число сторінок"
)
published_date = models.DateField(null=True, blank=True)
def __str__(self):
return self.title
Тепер у нас є модель, яка:
- Працює з жанрами книг через випадаючий список.
- Автоматично заповнює поля за замовчуванням.
- Перевіряє унікальність ISBN.
- Надає корисні підказки для користувачів.
Підводні камені та типові помилки
Коли починаєш працювати з атрибутами полів, легко заплутатися між null і blank. Пам'ятайте: null стосується бази даних, а blank — форм. Ще одна поширена помилка — не вказати max_length для CharField. Django не зможе вирішити за вас, скільки символів достатньо.
Також важливо пам'ятати, що атрибут choices робить вибір жорстким. Якщо в майбутньому ви захочете додати нові варіанти, доведеться оновлювати модель та міграції.
Практичне завдання
- Створіть модель для збереження даних про фільми. Нехай вона містить поля:
title(заголовок фільму, не довший за 150 символів).description(опис, можна залишити порожнім).rating(ціле число від 1 до 10).release_date(дата випуску, необов'язкова).
- Налаштуйте унікальність для поля
titleта обмеження дляrating(наприклад, за допомогою валідатора).
Перевірте свою модель у Django shell: створіть кілька об'єктів, оновіть та видаліть один із них. Переконайтеся, що обмеження працюють правильно.
python manage.py shell
>>> from movies.models import Movie
>>> movie = Movie(title="Inception", rating=9)
>>> movie.save()
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ