2016-09-28 2 views
2

私はQオブジェクトを動的に生成するにあたってthis articleを読んでいます。私は(ほとんどの部分)Qオブジェクトを理解するが、私は著者が、特にこの例をやっているか理解していないよ。私は特に得ることはありません何Django Qの理解 - 動的

# string representation of our queries 
>>> predicates = [('question__contains', 'dinner'), ('question__contains', 'meal')] 

# create the list of Q objects and run the queries as above.. 
>>> q_list = [Q(x) for x in predicates] 

>>> Poll.objects.filter(reduce(operator.or_, q_list)) 
[<Poll: what shall I make for dinner>, <Poll: what is your favourite meal?>] 

はリスト内包です。 Qオブジェクトは任意のキーワード引数でフォーマットされます(Q(question__contains='dinner')など)。

著者がリストの理解度を示唆しているようであれば、効果的に各繰り返しでQオブジェクト内にタプルを配置しませんか?このように:Q(('question__contains', 'dinner'))

このコードが正しくフォーマットされたQオブジェクトをどのように生成するのかよくわかりません。

答えて

4

この記事では、Q()がargsとkwargsを受け入れるという文書化されていない機能に依存しています。

source code for the Q classを見ると、__init__メソッドでは次のようになります。

class Q(tree.Node): 
    ... 
    def __init__(self, *args, **kwargs): 
     super(Q, self).__init__(children=list(args) + list(kwargs.items())) 

あなたは空のタプル()kwargsQ(question__contains=dinner)その後、argsを呼び出す場合は、辞書{'question__contains': 'dinner'}です。 super()コールでは、children変数はQ(('question__contains', 'dinner'))を使用する場合も、この結果を得ることができ

children = [('question__contains', 'dinner')] 

ノートに簡素化

children = list(()) + list(('question__contains', 'dinner'),) 

と評価さ

children = list(args) + list(kwargs.items()) 

です。この場合、argsはタプル(('question__contains', 'dinner'),)であり、kwargsは空の辞書{}です。

super()コールでは、children変数は、我々がQ(question__contains=dinner)Q(('question__contains', 'dinner'))と等価であることを示し、したがって、あなたしている

以前と同じ結果に簡素化
children = list((('question__contains', 'dinner'),)) + list([]) 

children = [('question__contains', 'dinner')] 

に評価しますリスト内包の2タプルのリストをループすることによって、Q()オブジェクトのリストを生成することができます。

>>> predicates = [('question__contains', 'dinner'), ('question__contains', 'meal')] 
>>> q_list = [Q(x) for x in predicates] 

個人的に、私は、

>>> predicates = [{'question__contains': 'dinner'}, {'question__contains': 'meal'}] 
>>> q_list = [Q(**kwargs) for kwargs in predicates] 

この方法を書くことを好むかもしれないあなたはQ__init__方法の動作に依存されていません。

+0

非常に素晴らしいです。それを踏んでいただきありがとうございます。 – qarthandso