我有一个带有ChoiceField的模型,我正在将QuerySet作为值,即:
list = Model.objects.filter(a='1').values('id','a','choicefield')
在这种情况下,choicefield的值将作为存储在DB中的任何内容返回。如果我将模型返回,我可以执行list.0.get_choicefield_display来获取完整的标签值。当我使用值列表时,似乎没有任何方法可以获得该值。我已尝试使用get_x_display版本更改值列表中的变量名称,但这也不起作用。
有什么想法吗?
答案 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以在模板级别执行相同操作。