Выбор модели Django - разве не лучше? - PullRequest
12 голосов
/ 15 января 2011

Учитывая поле;

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]

Есть ли лучший способ?Почему обычно используется кортеж кортежей?

Ответы [ 2 ]

14 голосов
/ 15 января 2011

Я считаю, что ключи dict не гарантируются для сортировки (если вы не используете OrderedDict, очевидно). Таким образом, вы можете «выбрать» «Offline», «Dev», «Live» в своей версии.

Замечание по реализации для dict.items :

Ключи и значения перечислены в произвольном порядке, который не является случайным, зависит от реализации Python и зависит от истории вставок и удалений словаря.

3 голосов
/ 16 января 2011

Расширение моего комментария к ответу @ 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)
...