[英]How to sum with condition in a Django queryset
我正在嘗試將 Django 查詢與條件相加。 假設我有一些這樣的數據:
| Name | Type |
---------------
| a | x |
| b | z |
| c | x |
| d | x |
| e | y |
| f | x |
| g | x |
| h | y |
| i | x |
| j | x |
| k | x |
| l | x |
這些類型是字符串,它們有值,比如x = 1, y = 25, z = -3
如何在沒有循環的情況下總結所有值? 目前使用循環。
data = A.objects.all()
sum = 0
mapp = {'x': 1, 'y': 25, 'z': -3}
for datum in list(data):
sum = sum + mapp[datum.type]
print(sum)
要在數據庫中執行計算,請使用Queryset.aggregate()
和使用Case
/ When
的聚合表達式:
from django.db.models import Sum, Case, When
A.objects.all().aggregate(
amount=Sum(Case(
When(type="x", then=1),
When(type="y", then=25),
When(type="z", then=-3),
default=0,
output_field=FloatField()
))
)
您可以將其簡寫為:
sum(mapp.get(o['Type'],0) for o in data)
如果您相信數據具有所有有效類型,則更簡單:
sum(mapp[o['Type']] for o in data)
(盡管不要相信數據)
如果映射x = 1, y = 25
等...來自另一個表,您可以使用一些 SQL voodoo 讓數據庫為您處理求和。 否則,您必須(以一種或另一種方式)遍歷所有結果並將它們總結起來。
理論上,您也可以只計算表中x
、 y
和z
的不同數量,並根據示例的結構使sum = x*count_of_x + y*count_of_y + z*count_of_z
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.