2011-02-09 8 views
0

私はDjangoのQ機能を使用していくつかのANDおよびOR SQLクエリを生成しようとしていますが、残念ながらDjangoが条件付きでどのように生成するのかわかりません。私はより複雑なクエリを持っていましたが、何が起こっているのかを見極めることにしました。 QなしDjangoのORMがQを使用するときは?

例():

>>> MyObject.objects.filter(status='VALUE').count() 
6 

そして今、Q():

>>> MyObject.objects.filter(Q(status='VALUE')).count() 
22 

そして、これはdjango.db.connectionから生成したクエリ:

[{'time': '0.001', 'sql': 'SELECT COUNT(*) FROM "myobjects_myobject" WHERE "myobjects_myobject"."status" = E\'VALUE\' '}, {'time': '0.001', 'sql': 'SELECT COUNT(*) FROM "myobjects_myobject"'}] 

そして、別の値を追加します:

>>> MyObject.objects.filter(Q(status='VALUE'), Q(created_date__lt=a_date_value)).count() 
22 

しかし、私は私が得るためという逆:SQLで

>>> MyObject.objects.filter(Q(created_date__lt=a_date_value), Q(status='VALUE'),).count() 
6 

:それは最初のQ値を毎回無視しているよう

[{'time': '0.001', 'sql': 'SELECT COUNT(*) FROM "myobjects_myobject" WHERE "myobjects_myobject"."created_date" < E\'2011-02-09 00:24:55.927825\' '}, {'time': '0.001', 'sql': 'SELECT COUNT(*) FROM "myobjects_myobject" WHERE "myobjects_myobject"."status" = E\'VALUE\' '} 

だから、それは私にように見える - 。この予想される行動?

答えて

1

あなたが実行した実際のコードがDjangoのバグに遭遇したのではない場合これは本当に重要それだけしかし、Qオブジェクトが本当に必要なことはありませんしません

>>> MyObject.objects.filter(status='VALUE').count() 
>>> MyObject.objects.filter(Q(status='VALUE')).count() 

以下は同じ結果を持っている必要があります。これに代えて

>>> qs = MyObject.objects.all() 
>>> qs.filter(Q(status='VALUE') | Q(status='UNKNOWN')).count() 

また、これを使用することができます:

>>> qs = MyObject.objects.all() 
>>> (qs.filter(status='VALUE') | qs.filter(status='UNKNOWN')).count() 
関連する問題