2010-06-14 77 views
0

我一直在尋找一種方法來在django中取得聯合查詢集。從我讀的你可以使用query1 | query2採取聯合...當使用values()雖然似乎不工作。我會跳過使用值,直到採取聯合之後,但我需要使用註釋來獲取一個字段和過濾器的總和,因爲沒有辦法做「group by」我必須使用values()。我讀過的其他建議是使用Q對象,但我想不出一種可行的方法。在Django ValuesQuerySet聯盟

我是否非常需要直接使用SQL或者是否有django這樣做?

我要的是:

q1 = mymodel.objects.filter(date__lt = '2010-06-11').values('field1','field2').annotate(volsum=Sum('volume')).exclude(volsum=0) 
q2 = mymodel.objects.values('field1','field2').annotate(volsum=Sum('volume')).exclude(volsum=0) 
query = q1|q2 

但是,這並不工作,因爲據我所知,我所需要的「值」部分是因爲有一個爲總知道如何採取行動,因爲它是一個沒有其他辦法15列表。

回答

2

QuerySet.values()不返回QuerySet,而是ValuesQuerySet,它不支持此操作。將它們轉換爲list然後添加它們。

query = list(q1) + list(q2) 
+0

這與聯合有點不同如果q1和q2有重疊,我最終會在查詢中出現重複的條目。我嘗試設置(q1)|設置(q2),但詞典本身是可散列的。 – Wuxab 2010-06-14 21:26:12

+0

有很多技巧可以在Python中獲得兩個列表的正確聯合,即使使用不可更改的類型。或者在最糟糕的情況下,您可以使用Schwartzian變換並將它們全部寫入字典。 http://en.wikipedia.org/wiki/Schwartzian_transform – 2010-06-14 21:31:00