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

3 投票
1 回答
4463 浏览
提问于 2025-04-18 06:44

我有一个模型里面有一个选择字段(ChoiceField),我正在获取一个值的查询集(QuerySet),也就是说:

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

在这种情况下,选择字段的值会返回数据库里存储的内容。如果我获取的是模型本身,我可以用 list.0.get_choicefield_display 来获取完整的标签值。不过,当我使用值列表时,似乎没有办法获取这个值。我试着把值列表中的变量名换成 get_x_display 的版本,但那也不管用。

有没有什么想法?

1 个回答

7

我觉得最简单的方法是用 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() 的使用,但就你描述的情况来看,我觉得没有问题。

如果你想使用 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']]

你也可以创建一个 自定义模板过滤器,在模板层面上实现同样的功能。

撰写回答