我正在尝试使用 Django 的 Q 功能来生成一些 AND 和 OR SQL 查询,但不幸的是我似乎无法弄清楚 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 值——这是预期的行为吗?