2017-02-13 17 views
0

'state'라는 필드가있는 모델이 있습니다. 'completed', 'in_progress', 'failed', 'created'와 같은 값을가집니다. 나는 테이블에 대해 나에게필드 값의 수를 명확하게 나열하는 장고 쿼리

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

같은 목록을 통해하는 장고 쿼리를 작성할 수 있다면 내가

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

원하는 출력이 목록이 아닙니다, 그것은 사전입니다. 지금까지 내가 아는 모든 장고 쿼리는 반복 가능한 구조의 일부 형식을 반환합니다. 일반적으로 쿼리 집합은 사전 목록이나 쿼리 대상 모델 인스턴스와 매우 유사합니다. 결과 목록을 반복하고 원하는 사전을 만들 수 있지만 비효율적 인 데이터 세트 크기에 따라 달라질 수 있습니다. – Neelik

+1

네, 데이터 크기가 커질 것이므로 루핑을 피할 수있게 해주는 쿼리 세트가 필요했습니다. –

답변

1

얘들 아 방금 방금 나 자신을 발견했습니다. 내 django 버전이 구식이기 때문에 aggregate_if를 사용했는데 가장 최신 버전은 conditional expressions으로 작성하는 것이 더 낫습니다. @shahanar

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

감사 도와 날이

0

을 알아내는 곳

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)) 
) 

이 당신을 위해 작동합니다 : -

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

이것이 정확한 출력을 얻지 못했습니다. 내 대답을 확인해. 그것은 올바른 결과를 반환했습니다. 당신의 노력에 감사드립니다. –