我有一个带有 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在模板级别做同样的事情。
