Skip to main content
 首页 » 编程设计

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

2025年05月04日18langtianya

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

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

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

有什么想法吗?

请您参考如下方法:

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

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

当然,您应该查看 caveats in the documentation在 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()) 
    ... 

现在您可以在 View 中明确查找字符串值:

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

您还可以创建一个 custom template filter在模板级别做同样的事情。