Варианты выбора модели Django - не было бы лучше диктовать?
С учетом поля;
domain_status_choices = (
(1,'Live')
(2,'Offline')
(3,'Dev')
)
status = models.SmallIntegerField( choices=domain_status_choices )
Я знаю, что могу получить и установить числовое представление и использовать get_status_display()
для получения текстовой метки. Но если пользователь отправляет status=Offline
, как я могу получить числовое значение, чтобы сохранить его? Я также хотел бы иметь возможность проверить, что цифры или текстовые значения находятся в списке.
Для меня имеет смысл использовать dict. Вот мой текущий метод;
domain_status_choices = {
1: 'Live',
2: 'Offline',
3: 'Dev',
}
status = models.SmallIntegerField( choices=domain_status_choices.iteritems() )
...
if input1 not in domain_status_choices.keys(): print "invalid"
if input2 not in domain_status_choices.items(): print "invalid"
status = [k for k, v in domain_status_choices.iteritems() if v == input3][0]
Есть ли лучший способ? Почему обычно используется кортеж кортежей?
Ответы
Ответ 1
Я считаю, что ключи от дикта не гарантируются для сортировки (если вы не используете OrderedDict
, очевидно). То есть вы "можете" получить версию "Offline", "Dev", "Live" с вашей версией.
Замечание по внедрению dict.items:
Ключи и значения перечислены в произвольном порядке, который является неслучайным, варьируется в зависимости от реализаций Python и зависит от истории вставки и удаления словарей.
Ответ 2
Расширение моего комментария на @vicvicvic ответ:
t = [ 'Live', 'Offline', 'Dev', ]
status = models.SmallIntegerField( choices=[(i,t[i]) for i in range(len(t))] )
...
if not 0 <= int(input1) < len(t): print "invalid"
if input2 not in t: print "invalid"
status = t.index(input2)