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()
1
Задача
Модуль 3: Django, 7 уровень, 3 лекция
Недоступна
Модель с предопределенными вариантами
Модель с предопределенными вариантами
1
Задача
Модуль 3: Django, 7 уровень, 3 лекция
Недоступна
Модель с датами и валидацией
Модель с датами и валидацией
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ