DjangoのQ機能を使用してANDおよびORSQLクエリを生成しようとしていますが、残念ながら、Djangoがいつどのように条件文を生成するのか理解できないようです。もっと複雑なクエリがありましたが、何が起こっているのかを確認するためにそれを整理することにしました。
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
しかし、その順序を逆にすると、次のようになります。
>>> MyObject.objects.filter(Q(created_date__lt=a_date_value), Q(status='VALUE'), ).count()
6
SQLの場合:
[{'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\' '}
したがって、毎回最初のQ値を無視しているように見えますが、これは予想される動作ですか?