2013-04-25 86 views
4

过滤对象中的values_list,真的帮助我在django视图中提供解决方案。Django values_list与选择字段

我的代码是像下面这一件作品:

values_list_ac = realdata.objects.filter(product = '1').values_list('company', 'brand', 'created_by__username') 

而用户名是在当前realdata模型之外不同的模型领域存在。

但是下面的代码不起作用,因为我想显示ac_type的值,它基于相同的realdata模型中的选择字段。 (我尝试通过使用模板的工作相同的解决方案来解决它):

values_list_ac = realdata.objects.filter(product = '1').values_list('company', 'brand', 'created_by__username', 'get_ac_type_display') 

难道还有比get_ac_type_display其他的解决方案,以显示字段值?

我真的很喜欢一些光线。

编辑: 这是我的模型:

class realdata(models.Model): 
     company = models.CharField(max_length=60, verbose_name="Company") 
     brand = models.CharField(_('brand'), max_length=60) 
     model = models.CharField(max_length=60) 
     type_choices = (
      (u'1', u'Inverter'), 
      (u'2', u'Non-Inverter'), 
     ) 
     ac_type = models.CharField(max_length=60, verbose_name="Type", choices=type_choices) 
     created_by = models.ForeignKey(User) 

非常感谢!

+0

首先向我们展示您的模型。 – alecxe 2013-04-25 03:59:23

回答

2

values_list函数只会获取存储在数据库中的值。在模型字段中定义选项时,它将存储元组的第一个值,因此这将是您要检索的内容。

这意味着您必须查看选择元组来确定项目的显示值。 get_foo_display的目的是为您提供这种人类可读的值,但它需要一个模型实例来处理。

因此,自己解决这个问题的一个解决方案是检查选项并相应地转换数据。下面应该是能够做到这一点:

result = [] 
for p in realdata.objects.filter(product='1').values_list(
          'company', 'brand', 'created_by__username', 'ac_type'): 
    choice = {k: v for k, v in realdata.type_choices}[p[-1]] 
    result.append(list(p[:-1]) + [choice]) 

result变量将包含转换列表。新变量是必需的,因为values_list函数将返回元组列表;后者是不可变的。此外,请注意将您想要解析的价值作为values_list呼叫中的最后一项,或者修改上述内容以匹配。