2017-02-13 28 views
0

我有一個模型,它有一個名爲'狀態'的字段。它具有像'完成','in_progress','失敗','創建'的值。我需要知道,如果我能寫,這將通過我喜歡Django查詢明確列出字段值的計數

{'completed': 2, 'in_progress': 5, 'failed': 0, 'created': 2} 

列表爲表Django的查詢值

id | order_id | state 
--------------------------- 
1 | 23  | completed 
2 | 23  | completed 
3 | 23  | in_progress 
4 | 23  | created 
5 | 23  | created 
6 | 23  | in_progress 
7 | 23  | in_progress 
8 | 23  | in_progress 
9 | 23  | in_progress 

我試圖運行下面的查詢

order_items = OrderItems.objects.filter(order=order) 
order_states = order_items.filter(
    state__in=['in_progress', 'completed', 'failed', 'created'] 
).values('state').annotate(Count('state')) 

但它給了我一個像這樣出現的清單

[{'state': u'completed', 'state__count': 8}, 
{'state': u'failed', 'state__count': 1}, 
{'state': u'in_progress', 'state__count': 1}] 
+1

你所需的輸出是不是列表,它是一本字典。就我所知,所有的Django查詢都會返回某種形式的可迭代結構,通常是一個QuerySet,它的行爲非常像字典列表,或者被查詢的模型實例。您可以遍歷結果列表並創建所需的字典,但取決於可能效率低下的數據集大小。 – Neelik

+1

是的,這就是我需要一個能夠避免循環的查詢集的原因,因爲數據量將會很大 –

回答

1

我剛剛發現自己。由於我的Django版本已經過時,我使用了最新版本的aggregate_if作爲conditional expressions

from django.db.models import Q 
from aggregate_if import Count, Sum 

order_states = order_items.aggregate(
    created=Count('pk', only=Q(state=OrderItems.STATE_CREATED)), 
    in_progress=Count('pk', only=Q(state=OrderItems.STATE_IN_PROGRESS)), 
    complete=Count('pk', only=Q(state=OrderItems.STATE_COMPLETED)), 
    failed=Count('pk', only=Q(state=OrderItems.STATE_FAILED)) 
) 

其中

OrderItems.STATE_CREATED = 'created' 
OrderItems.STATE_IN_PROGRESS = 'in_progress' 
OrderItems.STATE_COMPLETED = 'completed' 
OrderItems.STATE_FAILED = 'failed' 

感謝@shahanar幫我找出這個

0

這會爲你工作: -

from django.db.models import Count 
StateStatusCount = order_items.objects.values('state').annotate(the_count=Count('state')) 
print StateStatusCount 
+0

這就是我在做的沒有得到正確輸出的結果。檢查我的答案。這返回了正確的結果。謝謝你的努力 –