0

我正在尝试使用 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 值——这是预期的行为吗?

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 回答