在QuerySet值列表中获取ChoiceField的完整标签名称

时间:2014-05-16 06:05:50

标签: python django

我有一个带有ChoiceField的模型,我正在将QuerySet作为值,即:

list = Model.objects.filter(a='1').values('id','a','choicefield')

在这种情况下,choicefield的值将作为存储在DB中的任何内容返回。如果我将模型返回,我可以执行list.0.get_choicefield_display来获取完整的标签值。当我使用值列表时,似乎没有任何方法可以获得该值。我已尝试使用get_x_display版本更改值列表中的变量名称,但这也不起作用。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

我认为最简单的方法是使用only()代替values()。与values类似,only检索数据库列的子集。不同之处在于它创建了模型实例对象,这意味着您可以像往常一样使用get_X_display()

instances = MyModel.objects.filter(a='1').only('id', 'a', 'choicefield')
instances[0].get_choicefield_display()  # will work fine

当然,您应该查看only()defer()上的caveats in the documentation,但出于您所描述的目的,我没有看到问题。< / p>

如果您想使用values(),有很多方法可以解决此问题。一种方法是在模型中明确定义映射:

from collections import OrderedDict

class MyModel(models.Model):
    CHOICES_DICT = OrderedDict((
        (1, 'Choice 1'),
        (2, 'Choice 2'),
    ))
    choicefield = models.IntegerField(choices=CHOICES_DICT.items())
    ...

现在,您可以在视图中明确查找字符串值:

values = MyModel.objects.filter(a='1').values('id','a','choicefield')
name = MyModel.CHOICES_DICT[values[0]['choicefield']]

您还可以创建custom template filter以在模板级别执行相同操作。