Установите Django IntegerField с помощью выбора =… имя

Когда у вас есть поле модели с опцией выбора, вы склонны иметь магические значения, связанные с понятными для человека именами. Есть ли в Django удобный способ установить эти поля по понятному человеку имени вместо значения?

Рассмотрим эту модель:

class Thing(models.Model):
  PRIORITIES = (
    (0, 'Low'),
    (1, 'Normal'),
    (2, 'High'),
  )

  priority = models.IntegerField(default=0, choices=PRIORITIES)

В какой-то момент у нас есть экземпляр Thing, и мы хотим установить его приоритет. Очевидно, вы могли бы сделать,

thing.priority = 1

Но это заставляет вас запоминать отображение Приоритетов. Это не работает:

thing.priority = 'Normal' # Throws ValueError on .save()

В настоящее время у меня есть этот глупый обходной путь:

thing.priority = dict((key,value) for (value,key) in Thing.PRIORITIES)['Normal']

но это неуклюже. Учитывая, насколько распространенным может быть этот сценарий, мне было интересно, есть ли у кого-нибудь лучшее решение. Есть какой-то метод поля для установки полей по имени выбора, который я полностью пропустил?

Ответы на вопрос(7)

Ваш ответ на вопрос