Django, как получить человекопонятный текст Choices для значения выбора без экземпляра модели
Во-первых, да, я знаю о get_FOO_display()
. Это замечательно, если у вас есть экземпляр модели, но в моей ситуации его нет.
Я уверен, что каждый пользователь django в какой-то момент задается вопросом, почему Django использует кортежи, а не dict для определения вариантов выбора, но так или иначе, у меня есть такая модель:
class Review(models.Model):
PENDING = ''
APPROVED = 'A'
DECLINED = 'D'
SKIPPED = 'S'
RESULT_CHOICES = (
(PENDING, 'Pending'),
(DECLINED, 'Declined'),
(APPROVED, 'Approved'),
(SKIPPED, 'Skipped'),
)
result = models.CharField('result', max_length=1, choices=RESULT_CHOICES, blank=True, default='')
Теперь у меня нет экземпляра модели, но есть значение, например, A
, или D
. Как мне получить соответствующее текстовое значение, например Approved
, или Declined
и т.д. Я мог бы создать dict, а затем искать значение, но, конечно, есть более "встроенный в django" способ?
Не ищу такого подхода к молотку:
human_friendly = [
PENDING: 'Pending',
DECLINED: 'Declined',
APPROVED: 'Approved',
SKIPPED: 'Skipped',
]['A']
Начиная с версии 3.0 вы можете использовать перечислительный тип для выбора
class Review(models.Model):
class ResultChoices(models.TextChoices):
PENDING = ''
DECLINED = 'D'
APPROVED = 'A'
SKIPPED = 'S'
result = models.CharField('result', max_length=1, choices=ResultChoices.choices, blank=True, default=ResultChoices.PENDING)
Review.ResultChoices('A') # Review.ResultChoices.APPROVED
Review.ResultChoices('A').label # 'Approved'