2012-01-16 4 views
0

私はたくさんのWidgetオブジェクトを持っています。いくつかのフィールドにリスト内の値があるDjango QuerySetを正しく作成するにはどうすればよいですか?

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

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

基本的には、これを以下のfilterQueryというキーとして表現する方法を尋ねています。

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

ありがとうございます。

答えて

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) 

Qオブジェクトは位置引数でなければなりませんように、それはfilterQueryのキーとして機能しません。

ルックアップ関数は、Qオブジェクトとキーワード引数を組み合わせて使用​​できます。 ルックアップ関数(キーワード引数 またはQオブジェクト)に提供されるすべての引数は、一緒に「AND」されます。ただし、Qオブジェクトが である場合は、キーワード引数の定義に先行する必要があります。

+0

ありがとうございました。奇妙な私はDjangoのドキュメントでこれにぶつかりませんでした。よろしくお願いします。 –

2

これ:。のみ数値IDに動作し、またはサブクエリセット

は無意味である 'で'

例えばinは名前のリストでも問題ありません。

Widget.objects.filter(foo__in=['red', 'orange', 'green', 'blue']) 
+0

これは、問題のフィールドが実際には外部キーであったため、すべてを「int」に変換しようとしていた理由です。 –

+1

@AlanHそのターゲットテーブルで*フィールド*を照会する場合は、二重アンダースコアの構文 'Widget.objects.filter(foo__color__in = ['red'、 'orange'])' –

0

ありがとうございました!

また、リストの理解の中でいくつかのサブクエリを終了し、それらのIDを取得してinを使用して終了しました。私は中間オブジェクトを要求の後半で再度使用したので、(うまくいけば)価値があった。

+0

...を使用します。 1つのクエリでこれを行いました。そしてダニエルが言っているように、おそらく '__in'クエリがトリックを行います。 –

関連する問題