2011-02-09 58 views
0

我想使用Django的Q功能來生成一些AND和OR SQL查詢,但不幸的是,我似乎無法弄清楚Django如何以及​​何時生成它的條件。我有一個更復雜的查詢,但我決定削減它看看發生了什麼事情。當Django的ORM使用Q?

實施例而不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值 - 這是在預期的行爲?

回答

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()