2016-11-30 68 views
0

我決不是一個Django專家,需要一些問題的指導。Django ORM複合過濾器變量

對於背景,我有一箇舊的.NET項目,我已被任命爲Django項目。該項目獲取完整的對象列表,然後運行一大組用戶設置過濾器,以獲得所需的一組對象。

一個.NET中的過濾器可能是這樣的...

matched.RemoveAll(x => ((x.annualIncome/12) - x.payment) < monthlyIncome); 

我試圖找出我將如何與Django的ORM做到這一點。我很喜歡這個。

在僞碼Django的ORM版本(是的,這是不行的):

matched.exclude(((annualIncome /12)-payment)__gt = monthlyIncome) 

有30多個過濾器之前這一個,所以我不能重新做他們都在一個不同的方式。我顯然可以通過每個對象和過濾器,但我決定先問。

我對這裏的解決方案很開放,或者友好的「RTFM,這個頁面可以回答它。」

在此先感謝,並請MODS的一個更好的標題編輯爲我的大腦現在已經正式從3天的流感編碼炒。

+0

我可以幫你,但我不會說.NET和從你的文字,我不能找出哪些僞碼的部分實際上是示範田,哪些只是變量...我可以假設, 'annualIncome'和'payment'是int/float變量,'monthlyIncome'是要過濾的數據庫字段? – makaveli

+0

年度收入和付款是模型字段,每月收入是一個變量。 – warpedspeed

回答

0

在這種情況下,歡迎Django的ORM的魔法世界(而不是在一個糟糕的意義上說,它實際上是相當合理的大部分時間:)。

from django.db.models import F, Case 

# Your stuff 
matches.annotate(
    req=Case(default=(F('annualIncome')/12) - F('payment')) 
).exclude(req__gt=monthlyIncome) 

因爲你不能在那樣一個計算的直接查詢,則F對象告訴ORM,這應該是來自數據庫,去得到它。
未經測試(由於我的項目中缺少類似案例),但如果出現問題,請告訴我。

PS。您可以將req名稱更改爲您喜歡的任何名稱。編輯:
哇,這很尷尬。你也可以不用Case

matches.annotate(req=(F('annualIncome')/12) - F('payment')).exclude(req__gt=monthlyIncome) 
+0

太棒了,非常感謝。 – warpedspeed

+0

@warpedspeed我更新了答案 – makaveli

+0

我完全明白了。再次感謝@makaveli - 這正是我一直在尋找的。 – warpedspeed