Что такое IntegerChoices в Django и для чего он используется

Ответ

Класс models.IntegerChoices в Django — это современный способ создания перечислений (enum) для полей моделей, который пришел на смену классическому подходу с кортежами. Он делает код более читаемым, безопасным и самодокументируемым.

Основная задача — связать целочисленные значения, хранящиеся в базе данных, с понятными именованными константами в коде.

Преимущества:

  • Читаемость: Вместо "магических чисел" (например, status=1) используется понятный код: status=Article.Status.PUBLISHED.
  • Автоматизация: Автоматически генерирует атрибут .choices для передачи в поле модели.
  • Удобный API: Предоставляет свойства .label (человекочитаемое имя) и .value (значение для БД).

Пример использования:

from django.db import models

class Article(models.Model):
    class Status(models.IntegerChoices):
        DRAFT = 0, 'Черновик'
        PUBLISHED = 1, 'Опубликовано'
        ARCHIVED = 2, 'В архиве'

    title = models.CharField(max_length=200)
    status = models.IntegerField(
        choices=Status.choices, 
        default=Status.DRAFT
    )

# Использование в коде:
article = Article.objects.get(pk=1)

# Проверка статуса
if article.status == Article.Status.PUBLISHED:
    print("Статья опубликована.")

# Получение человекочитаемого названия
print(article.get_status_display()) # Выведет: 'Опубликовано'

# Использование API самого enum
print(Article.Status.PUBLISHED.label) # Выведет: 'Опубликовано'
print(Article.Status.PUBLISHED.value) # Выведет: 1