Когда мы определяем варианты 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 — это отличная возможность, помогающая работать с вариантами модели интуитивно и надежно.
Покиньте прошлый метод с кортежами и поднимите качество кода на новый уровень!
댓글이 없습니다.