Django模型领域选择 - 不会更好吗?

时间:2011-01-15 09:56:42

标签: python django django-models

给定一个字段;

domain_status_choices = (
    (1,'Live')
    (2,'Offline')
    (3,'Dev')
)
status = models.SmallIntegerField( choices=domain_status_choices )

我知道我可以获取并设置数字表示,并使用get_status_display()来获取文本标签。但是,如果用户发布status=Offline,我如何获取数值才能保存?我还希望能够验证列表中的数字或文本值。

对我而言,使用词典更有意义。这是我目前的方法;

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 个答案:

答案 0 :(得分:14)

我相信dict的键不能保证排序(除非你明显使用OrderedDict)。也就是说,你"可能" get"离线"," Dev"," Live"您的版本选择。

关于dict.items的实施说明:

  

键和值以任意顺序列出,这是非随机的,在Python实现中各不相同,并且取决于字典的插入和删除历史。

答案 1 :(得分:3)

扩展我对@ 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)