Когда мы определяем варианты CharField или TextField в модели Django, мы часто использовали списки кортежей.
Однако, воспользовавшись TextChoices, введенным с Django 3.0, мы можем создать гораздо более чистый и осмысленный код.


1. Определение вариантов модели: традиционный метод

Способ, которым мы обычно пользуемся, выглядит следующим образом - список кортежей.

# models.py
STATUS_CHOICES = [
    ('DF', 'Черновик'),
    ('PB', 'Опубликовано'),
    ('AR', 'Архивировано'),
]

class Post(models.Model):
    status = models.CharField(max_length=2, choices=STATUS_CHOICES, default='DF')

Недостатки традиционного метода: - Трудно понять смысл кода ('DF' трудно определить сразу) - Несмотря на использование get_FIELD_display(), он не структурирован в стиле Enum, что затрудняет поддержку - Необходимо хардкодить в сравнительных условиях

if post.status == 'DF':
    ...

2. Улучшение с помощью метода TextChoices


Посмотрев на исходный код, можно увидеть, что принцип прост, поэтому тем, кто интересуется, как это работает, рекомендуется заглянуть в исходный код Django.
Здесь я хочу объяснить только способ использования.

# models.py
from django.db import models

class PostStatus(models.TextChoices):
    DRAFT = 'DF', 'Черновик'
    PUBLISHED = 'PB', 'Опубликовано'
    ARCHIVED = 'AR', 'Архивировано'

class Post(models.Model):
    status = models.CharField(max_length=2, choices=PostStatus.choices, default=PostStatus.DRAFT)

Преимущества этого метода: - Можно обрабатывать условия с осмысленными именами, такими как PostStatus.DRAFT - Полная поддержка get_status_display() - Можно обращаться как к объектам, как к enum, что удобно для автозаполнения IDE и статического анализа

if post.status == PostStatus.DRAFT:
    ...
  • Повторное использование: если несколько моделей должны разделять одни и те же варианты, их можно определить в отдельном файле (choices.py)

Фактически, повторное использование является главным преимуществом использования этого класса TextChoice. Если есть общие варианты, используемые в нескольких приложениях Django, их можно поместить в commons/choices.py и использовать в любом приложении.


3. Заключение


TextChoices в Django — это отличная возможность, помогающая работать с вариантами модели интуитивно и надежно.
Покиньте прошлый метод с кортежами и поднимите качество кода на новый уровень!