Ответ
Класс 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