【发布时间】:2011-06-23 20:07:02
【问题描述】:
我正在尝试使用 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 值 - 这是预期的行为吗?
【问题讨论】:
标签: django django-queryset django-q