4

values_list过滤对象中,确实帮助我在 django 视图中提供解决方案。

我的代码如下所示,这个有效:

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

而用户名是存在于当前真实数据模型之外的不同模型中的字段。

但是下面的代码不起作用,因为我想显示 的值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)

非常感谢!

4

1 回答 1

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调用中的最后一项,或调整以上内容以匹配。

于 2013-08-13T13:18:40.370 回答