2013-02-28 64 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