簡體   English   中英

如何在 Django 查詢集中對條件求和

[英]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 讓數據庫為您處理求和。 否則,您必須(以一種或另一種方式)遍歷所有結果並將它們總結起來。

理論上,您也可以只計算表中xyz的不同數量,並根據示例的結構使sum = x*count_of_x + y*count_of_y + z*count_of_z

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM