장고: 쿼리를 통해 열 값의 합 계산
모델이 있습니다.
class ItemPrice(models.Model):
price = models.DecimalField(max_digits=8, decimal_places=2)
# ...
나는 이것의 합을 계산하기 위해 이것을 시도했습니다.price
다음 쿼리 집합에서:
items = ItemPrice.objects.all().annotate(Sum('price'))
이 질문에 무슨 문제가 있습니까?또는 의 합을 계산하는 다른 방법이 있습니까?price
칼럼?
쿼리 세트의 루프에 사용하여 이 작업을 수행할 수 있다는 것을 알고 있지만 우아한 솔루션이 필요합니다.
감사합니다!
당신은 아마도 찾고 있을 것입니다.
from django.db.models import Sum
ItemPrice.objects.aggregate(Sum('price'))
# returns {'price__sum': 1000} for example
사용하다.aggregate(Sum('column'))['column__sum']
아래의 제 예를 참고하세요.
sum = Sale.objects.filter(type='Flour').aggregate(Sum('column'))['column__sum']
주석을 달면 결과에 필드가 추가됩니다.
>> 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')}
cProfileProfiler를 사용하면 개발 환경에서 목록의 값을 합하는 것이 다음을 사용하여 집계하는 것보다 더 효율적(빠름)이라는 것을 알 수 있습니다.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
동일한 결과를 생성하는 데 항상 더 오랜 시간이 걸립니다.목록을 요약하는 대신 메모리 측면에서 사용하면 이점이 있을 수 있다고 생각합니다.
이전 답들은 꽤 괜찮았고, 바닐라 코드 라인으로 총계를 얻을 수도 있습니다.
items = ItemPrice.objects.all()
total_price = sum(items.values_list('price', flat=True))
또한 다음과 같은 방법으로 합계를 얻을 수 있습니다.
def total_sale(self):
total = Sale.objects.aggregate(TOTAL = Sum('amount'))['TOTAL']
return total
합계를 계산할 모형의 열 이름으로 '금액'을 바꾸고 모델 이름으로 '판매'를 바꿉니다.
다음의 합계를 계산하려면 aggregate()와 Sum()을 사용해야 합니다.price
아래와 같이 열을 표시합니다.*all()이 있는 쿼리는 아래와 같이 all()이 없는 쿼리와 동일합니다.
from django.db.models import Sum
print(ItemPrice.objects.all().aggregate(Sum('price')))
print(ItemPrice.objects.aggregate(Sum('price')))
그런 다음 아래 사전이 콘솔에 출력됩니다.
{'price__sum': Decimal('150.00')}
{'price__sum': Decimal('150.00')}
기본 키를 변경할 수 있습니다.price__sum
로.priceSum
아래 표시된 가격 열:
from django.db.models import Sum
# ↓ Here
print(ItemPrice.objects.all().aggregate(priceSum=Sum('price')))
print(ItemPrice.objects.aggregate(priceSum=Sum('price')))
# ↑ Here
그런 다음 아래와 같이 기본 키가 변경됩니다.
{'priceSum': Decimal('150.00')}
{'priceSum': Decimal('150.00')}
언급URL : https://stackoverflow.com/questions/8616343/django-calculate-the-sum-of-the-column-values-through-query
'code' 카테고리의 다른 글
파이썬에서 어떻게 YAML 매핑을 OrderedDicts로 로드할 수 있습니까? (0) | 2023.07.17 |
---|---|
입력된 배열이 비어 있는 초기 상태를 입력하고 초기 상태를 설정합니다. (0) | 2023.07.17 |
파이프 의존성/요구사항을 나열할 수 있는 방법이 있습니까? (0) | 2023.07.17 |
pandas.read_message 매개 변수 "sheet_name"이(가) 작동하지 않습니다. (0) | 2023.07.17 |
빈 셀을 "NA"로 변경 (0) | 2023.07.17 |