Django : 쿼리를 통해 열 값의 합계 계산


92

나는 모델이있다

class ItemPrice( models.Model ):
     price = models.DecimalField ( max_digits = 8, decimal_places=2 )
     ....

price이 쿼리 세트 의 합계를 계산하기 위해 이것을 시도했습니다 .

items = ItemPrice.objects.all().annotate(Sum('price'))

이 쿼리에서 무엇이 잘못 되었습니까? 또는 price열의 합계를 계산하는 다른 방법이 있습니까?

나는 이것이 queryset에서 for 루프를 사용하여 수행 할 수 있다는 것을 알고 있지만 우아한 솔루션이 필요합니다.

감사!


이것이 귀하의 질문에 대답합니까? 장고 SUM 쿼리?
Flimm

답변:


196

당신은 아마 찾고 있습니다 aggregate

from django.db.models import Sum

ItemPrice.objects.aggregate(Sum('price'))
# returns {'price__sum': 1000} for example

1
가격이 5000 인 총 수를 어떻게 얻을 수 있습니까?
Anuj Sharma

6
예를 들어 부동 / 정수가 아닌 사전을 반환합니다 {'price__sum':1000}. 부동 / 정수를 얻을 수 있음yourdict['price__sum']
Josh

35

Annotate는 결과에 필드를 추가합니다.

>> Order.objects.annotate(total_price=Sum('price'))
<QuerySet [<Order: L-555>, <Order: L-222>]>

>> orders.first().total_price
Decimal('340.00')

Aggregate는 요청 된 결과와 함께 dict를 반환합니다.

>> Order.objects.aggregate(total_price=Sum('price'))
{'total_price': Decimal('1260.00')}

key합계 value를 저장할를 지정하는 방법을 보여 주셔서 감사합니다 .
MikeyE

32

.aggregate(Sum('column'))['column__sum']아래 내 예제를 사용하십시오.

sum = Sale.objects.filter(type='Flour').aggregate(Sum('column'))['column__sum']

5

cProfile 프로파일 러를 사용하면 개발 환경에서 Sum(). 예 :

sum_a = sum([item.column for item in queryset]) # Definitely takes more memory.
sum_b = queryset.aggregate(Sum('column')).get('column__sum') # Takes about 20% more time.

나는 이것을 다른 맥락에서 테스트 aggregate했으며 동일한 결과를 생성하는 데 항상 더 오래 걸리는 것처럼 보입니다 . 목록을 합산하는 대신 사용하는 것이 메모리 현명한 이점이 있다고 생각하지만.


1
또는 목록 대신 생성기 표현식을 사용하십시오 sum_a = sum(item.column for item in queryset).. 유일한 차이점은 제거 된 []s입니다. 이렇게하면 목록을 sum()반복 하기 전에 전체 목록을 계산하기위한 메모리 공간이 절약 됩니다.
Code-Apprentice
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.