2010-06-14 78 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