2015-02-23 55 views
3

我會怎麼做下面的查詢(在僞代碼):乘兩個字段一起在Django ORM

CueCompletion.objects.filter(
    user_id=profile_user.pk, status_action_taken_on__gte=day_ago 
).sum('amount' * 'opportunities') 

基本上,我想要得到的金額以上查詢的總和*機會。

回答

2

實現它的一種可能方法是使用稱爲values_list的Queryset方法。

它返回一個特定的查詢集(一個ValuesListQuerySet),然後你可以對它做一些進一步的計算。

你可以這樣做:

vqs = CueCompletion.objects.filter( user_id=profile_user.pk, status_action_taken_on__gte=day_ago ).values_list('amount','opportunities')

,然後你將有類似vqs = [(50, 2), (100, 4), (25, 2), ...],即中ñ元組「名單」,每一個都具有機會值領域。

(實際上vqs它不是一個列表,它是一個ValuesListQuerySet,但對我們的下一步行動無關緊要)。


我們的下一步行動(又名進一步計算)爲:

total = sum(t[0] * t[1] for t in vqs)

,我們正在使用一個包含所有我們( * 機會發電機內置它sum()功能)結果。

(爲什麼使用發電機,而不是一個列表理解?檢查this answer!)

+0

您應該獲得此解決方案的獎章。 – MiniGunnR 2015-11-03 22:23:06

0

您還可以添加註釋到查詢集在使用F對象。這樣你就可以完成數據庫中所有的計算,比將所有值拉入列表並使用python內存做列表理解更快。

CueCompletion.objects.filter(
user_id=profile_user.pk, status_action_taken_on__gte=day_ago 
).annotate(total=F('amount') * F('opportunities')) 

現在,您可以通過total變量訪問此值。