JavaRush /Курси /Модуль 3: Django /Визначення атрибутів моделі

Визначення атрибутів моделі

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

Якщо ти тільки почав працювати з Django, то, ймовірно, задаєшся питанням: "Чому просто вказівки типу поля недостатньо? Який сенс у цих додаткових атрибутах?". Чудове питання! Давай подивимось на аналогію: уяви, що ти відкриваєш банківський рахунок. Рахунок — це "поле", але є додаткові налаштування: обмеження на кількість коштів, валюта рахунку, мінімальна сума поповнення.

У Django атрибути полів потрібні, щоб:

  1. Керувати обмеженнями на введені дані.
  2. Задавати значення за замовчуванням (щоб база не "сварилася", якщо дані не вказані).
  3. Робити поле обов'язковим чи необов'язковим.
  4. Вказувати довжину для текстових даних або діапазон для чисел.
  5. І, звісно, підвищувати читабельність коду та його стійкість до помилок.

Основні атрибути полів та їх налаштування

Тепер перейдемо до "смачного" — це список часто використовуваних атрибутів і приклади їх застосування. Щоб не бути голослівними, ми будемо використовувати просту модель, наприклад, для зберігання даних про книги.

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 робить вибір жорстким. Якщо в майбутньому ви захочете додати нові варіанти, доведеться оновлювати модель та міграції.

Практичне завдання

  1. Створіть модель для збереження даних про фільми. Нехай вона містить поля:
    • title (заголовок фільму, не довший за 150 символів).
    • description (опис, можна залишити порожнім).
    • rating (ціле число від 1 до 10).
    • release_date (дата випуску, необов'язкова).
  2. Налаштуйте унікальність для поля title та обмеження для rating (наприклад, за допомогою валідатора).

Перевірте свою модель у Django shell: створіть кілька об'єктів, оновіть та видаліть один із них. Переконайтеся, що обмеження працюють правильно.

python manage.py shell
>>> from movies.models import Movie
>>> movie = Movie(title="Inception", rating=9)
>>> movie.save()
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ