【问题标题】:Django field choices: Avoid repeating value and human-readable form?Django 字段选择:避免重复值和人类可读的形式?
【发布时间】:2015-08-28 19:31:14
【问题描述】:

我有很多Fields 和有限的choices 集。对于所有这些,人类可读的形式与字段的存储值相同。例如,

color = models.CharField(max_length=20,
                                 choices=[('blue', 'blue'),
                                          ('red', 'red'),
                                          ('yellow', 'yellow')
                                          ('green', 'green'),
                                          ('pink', 'pink')])

我不想重复输入每个选项。有没有办法我可以写这样的东西:

color = models.CharField(max_length=20,
                                 choices=['blue',
                                          'red',
                                          'yellow',
                                          'green',
                                          'pink'])

然后 Django 会自动判断出'red' 是值并且是人类可读的形式?

【问题讨论】:

    标签: django


    【解决方案1】:

    Django 需要一个 2 元组序列,而您不能真的期望它(至少在不修改 Django 的情况下)。

    幸运的是,使用常规列表和 Python 内置函数很容易创建此结构:

    In [4]: choices = list('abcde')
    
    In [5]: choices = tuple(zip(choices, choices))
    
    In [6]: choices
    Out[6]: (('a', 'a'), ('b', 'b'), ('c', 'c'), ('d', 'd'), ('e', 'e'))
    

    正如 OP 在 cmets 中指出的那样,您也可以轻松地将其作为列表组合进行:

    choices = [(c, c) for c in 'abcde']
    

    【讨论】:

    • @ShangWang 没问题。它只是一个list 而不是tuple,这可能不太理想,因为它是可变的。 Django 不关心任何一种方式,只要它是可迭代的。
    • 我能以某种方式写这个,但跳过中间变量choices?也就是说,类似于:color = models.CharField(max_length=20, choices=[zip(...)])
    • 没关系,我想通了:color = models.CharField(max_length=20, choices=[(c,c) for c in ['red', 'blue', 'yellow'])
    猜你喜欢
    • 2018-06-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2017-08-20
    相关资源
    最近更新 更多