0

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値を無視しているように見えますが、これは予想される動作ですか?

4

1 に答える 1

1

これが、Djangoのバグに遭遇したよりも、実行した実際のコードである場合。

以下は同じ結果になるはずです。

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

それはそれほど重要ではありませんが、Qオブジェクトが実際に必要になることは決してありません。

これの代わりに:

>>> 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()
于 2011-02-09T01:43:22.163 に答える