2016-10-05 10 views
1

ジャンゴ1.10.1Qオブジェクト

from django.db.models import Q 
q = Q(title__icontains='r') 

print(q) 
>>> (AND: ('title__icontains', 'r')) 

を(一度にOR接続タイプでそれを作る)私はちょうど同じですが、とのOR論理演算を作成することが可能であるかどうかを考えました。

私は得ることができ

ORこのような:

for item in q_objects: 
    query |= item 

、あるいは何か他の(lamdbaを使用)。

しかし、私はこのQオブジェクトを感じることはありません。そしてこの質問は私がそれをよりよく理解する助けになるかもしれません。

つまり、コンストラクタ経由で(OR:( 'title__icontains'、 'r'))を表示するオブジェクトを作成できるかどうかを確認します。

答えて

0

ハック:あなたは将来のためのQクラスを変異させ(!および既存)しているため、ユーザー

>>> Q.default = Q.OR 
>>> q = Q(title__icontains='r') 
>>> q 
<Q: (OR: ('title__icontains', 'r'))> 

は、これをしないでください。

もっと丁寧:

from django.db.models import Q 

class MyQ(Q): 
    default = Q.OR 

q = MyQ(title__icontains='r') 

しかし、あなたは今Qのサブクラスのインスタンスを持っています。これは問題ではないはずですが、実際にはこれらの単純なオブジェクトでは不要です。より高度な方法があります:

>>> from django.db.models import Q 
>>> q = Q.__new__(Q) 
>>> q.default = Q.OR 
>>> q.__init__(title__icontains='r') 
>>> q 
<Q: (OR: ('title__icontains', 'r'))> 
>>> Q.default # existing Q instances are unaffected 
u'AND' 
+0

は有望に見えます。私は消化しなければならない。私にしばらくお待ちください。 – Michael

0

@wimの回答は素晴らしいです! ちょっと追加:

Qの新しいオブジェクトを作成するのは失敗しているように見えますが、デフォルトのコネクタをQ.default = Q.ORに変更することができます。

また、あなたがやって一度にすべてのクエリパラメータを渡すことができます。

Model.objects.filter(Q(**query_dict)) 
# Make sure to use query dictionary taking note of the fact that simply using 
# Double star operator would produce list values. You can do: 
dictionary = dict(query_dict) 
well_formed = {key: dictionary.get(key)[0] for key in dictionary.keys()} 
result = Model.objects.filter(Q(**query_dict))