0

たくさんのウィジェット オブジェクトがあります。

各ウィジェットには「foo」という文字列プロパティがあります。そして、「foo」が「red」、「orange」、「green」、または任意の色に設定されたウィジェットを照会し、適切な「foo」プロパティを持つウィジェットのみを含める必要があります。また、これらの色はユーザー入力によるものであるため、信頼できません。すべての結果を読み込んでフィルタリングするのではなく、SQL でこれを行います。

しかし… 「AND」で句を結合する方法しか見当たりません。「OR」ではありません。そして、「in」はガベージです(「in」は数値IDまたはサブクエリセットでのみ機能し、同じ問題になります!)。他のことも試してみましたが、うまくいかないようでした。

基本的には、これを以下のキーとしてどう表現するかを聞いていfilterQueryます。

myNiceWidgets = Widget.objects.filter(**filterQuery).orderBy(...)

ありがとう。

4

3 に答える 3

3

を使用するにはOR、django のQオブジェクトを調べます。

https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

Widget.objects.filter(Q(foo='red') | Q(foo='green'), **filterQuery)

filterQueryQ オブジェクトは位置引数でなければならないため、キーとしては機能しません。

ルックアップ関数では、Q オブジェクトとキーワード引数を混在させることができます。ルックアップ関数に提供されるすべての引数 (キーワード引数または Q オブジェクト) は、一緒に「AND」されます。ただし、Q オブジェクトを指定する場合は、キーワード引数の定義より前に配置する必要があります。例えば:

于 2012-01-16T03:06:25.120 に答える
2

これ:

「in」は、数値 ID またはサブクエリセットでのみ機能します

ナンセンスです。in名前のリストで問題ありません:

Widget.objects.filter(foo__in=['red', 'orange', 'green', 'blue'])
于 2012-01-16T07:14:15.520 に答える
0

あなたの答えをありがとう!

また、リスト内包表記でいくつかのサブクエリを実行し、それらのIDを取得してを使用することも終了しましたin。リクエストの後半で中間オブジェクトを再度使用したので、(うまくいけば)価値がありました。

于 2012-01-16T18:58:30.173 に答える