4

生のSQLを使用してかなり簡単に記述できるもう少し複雑なクエリを作成したいと考えています。生のクエリの例を次に示します。

SELECT my、fields FROM sales WHERE is_paid = False OR status ='toship' AND otherfield ='FOO' AND anotherfield ='BAR'

これは単純で、is_paid = Falseであるすべての結果を生成し、次にAND一致の2番目の結果セットを生成します。

Qオブジェクトについては知っていますが、フィルタリングについては知っていますが、DjangoORMでこれをきれいに実現する方法について頭を悩ませているようには見えません。

任意のヒント?

ありがとう

4

4 に答える 4

25

やや動的な方法でQオブジェクトを構築し続けることができます。

例:

query1 = Q(is_paid=False)

query2 = Q()

if status:
    query2 = Q(status=status)

if otherfield:
    query2 = query2 & Q(otherfield=otherfield)

if anotherfield:
    query2 = query2 & Q(anotherfield=anotherfield)

query = query1 | query2

result = model.objects.filter(query)
于 2009-07-23T18:19:10.233 に答える
15

googletorpは、文字列を使用して動的にクエリを作成できないことは正しいですが、辞書パラメータを使用して作成することはできます。何かのようなもの:

model.objects.filter(Q(**mydict1) | Q(**mydict2))

ここで、mydict1と2の形式は次のとおりです。

{'field1': 'value1'}
{'field2__icontains': 'value2'}

于 2009-07-22T18:27:27.600 に答える
2

このようなものが機能するはずです:

model.objects.filter(Q(is_paid=False) | Q(status='toship', otherfield='FOO', anotherfield='BAR'))

編集:完了時に実行されるSQLステートメントを含む文字列を作成するのと同じ方法でクエリを動的に作成することはできません。これを実行したい場合は、if状態、関数、またはユースケースに最適なものを使用することをお勧めします。

if query == 'simple':
    result = model.objects.filter(Q(is_paid=False))
else:
    result = model.objects.filter(Q(is_paid=False) | Q(status='toship', otherfield='FOO', anotherfield='BAR'))
for items in result:
    ...

これはもっと複雑かもしれませんが、あなたはその考えを理解していると確信しています。

于 2009-07-22T15:42:37.470 に答える
2

これは、動的な「OR」クエリを実行するための優れた方法です。

import operator
from django.db.models import Q
from your_app.models import your_model_object

q_list = [Q(question__startswith='Who'), Q(question__startswith='What')]
your_model_object.objects.filter(reduce(operator.or_, q_list))

「AND」を使用する場合:

your_model_object.objects.filter(reduce(operator.and_, q_list))
于 2017-01-13T17:28:25.393 に答える