2016-11-30 8 views
0

私は決してDjangoエキスパートではなく、問題に関するガイダンスが必要です。変数付きDjango ORMコンパウンドフィルタ

バックグラウンドでは、私は以前の.NETプロジェクトを持っており、これはDjangoプロジェクトを開始するように任されています。プロジェクトはオブジェクトの完全なリストを取得し、その後、目的のセットのオブジェクトで終わるように大きなセットのユーザーセットフィルターを実行します。

.NETでのフィルタの一つは、私はDjangoのORMでこれを行うだろうかを把握しようとしているので...

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

ようなものかもしれません。私は親切にこれに固執しています。擬似コードで

は(はい、これは動作しません)ORMバージョンをジャンゴ:

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

はこの1つは、そう私はそれらすべてを再実行することはできません前に30+のフィルタがあります異なる方法。私は明らかに各オブジェクトとフィルタを通過することができますが、私は最初に尋ねることに決めました。

私はここのソリューションや友好的な "RTFM、このページに答えます。"

前もってありがとうございました。私の脳がインフルエンザでコード化された3日目から正式に揚げられたので、改造してください。

+0

私はあなたを助けることができるが、私は.NETを話すことはありませんし、テキストから私は擬似コードの部分は、実際にモデルフィールドであり、これはただの変数である...私はと仮定することができます把握することはできません'annualIncome'と' payment'はint/float変数で、 'monthlyIncome'はフィルタリングするDBフィールドです。 – makaveli

+0

annualIncomeとpaymentはモデルフィールドで、monthlyIncomeは変数です。 – 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

関連する問題