2013-02-28 49 views
1

我有一个名为data的ValuesQuerySet。Django值的集合queryset

我试图让所有类型的汇总数为每个对象

data.values('type')产生这样的输出:

[{'type': u'internal'}, {'type': u'internal'}, {'type': u'external'}, {'type': u'external'}] 

我想这样的故障(可以有更多然后只是“内部”和“外部”的选择,这可能是多达20种不同的:

internal: 2 
external: 2 

我想这一点,但它只是返回一个空字典...

data.values('type').aggregate(Count('type')) 

注释是生产undesirbale结果,以及:

data.values('type').annotate(Count('type')) 


[{'type': u'internal', 'type_count': 1}, {'type': u'internal', 'type_count': 1}, {'type': u'external', 'type_count': 1}, {'type': u'external', 'type_count': 1}] 

Models.py

class Purchase(models.Model):  

    type = models.ForeignKey(Types) 
+0

data是什么类型,data.values('type')'的类型是什么? – 2013-02-28 14:34:05

+0

这是一个ValuesQuerySet – Austin 2013-02-28 14:37:40

回答

5
lists = ModelName.objects.values('type').annotate(count=Count('type')) 

在HTML:

{% for list in lists %} 
    {{list.type}} - {{list.count}}<br/> 
{% endfor %} 

测试:

{{lists}} 
//don't use forloop yet. This will tests if the above query produce data or it is empty 

更新:

def view_name(request): 
    lists = ModelName.objects.values_list('type', flat=True).distinct() 
    types = [] 
    for list in lists: 
     type_count = ModelName.objects.filter(type=list.type).count() 
     types.append({'type': list.type, 'count': type_count}) 

    return render(request, 'page.html', { 
      'types': types, 
    }) 

{% for type in types %} 
    {{type.type}} - {{type.count}} 
{% endfor %} 
+0

这仍然为我返回一个空的字典。我在这个模型中有将近500k个对象,但是没有任何东西是从那个查询产生的 – Austin 2013-02-28 14:43:14

+0

@Austin试图改变聚合来注释。之后,在您的模板测试中,像{{lists}},不要使用forloop。这是为了测试,以便我们知道是否有查询 – catherine 2013-02-28 14:47:24

+0

我确实使用注释获得了某些期望的结果。与QuerySet相比,问题是否具有ValuesQuerySet?我想尝试避免另一个数据库调用,因为我的'数据'变量来自使用使用过滤器和排除的查询。然后我从那里获取特定字段的值()。我想我只是想了解为什么我的原始代码不起作用。 – Austin 2013-02-28 14:52:25

1

他们有几个方法,让我们supose你想在字典中的结果,最简单的方法是:

results = { 'internal': data.filter(value = 'internal' ).count(), 
      'external': data.filter(value = 'external' ).count() } 

对于一些查询集你可以使用itertools,这将工作从数据库层转换为django层。这意味着它只是小型查询集的解决方案。

from itertools import groupby 
results = groupby(data.all(), lambda x: x.type) 
+0

我应该提到可以有两种以上的选择。除“内部”和“外部”外最多可以有20个 – Austin 2013-02-28 14:33:43