【问题标题】:Union on ValuesQuerySet in djangodjango 中 ValuesQuerySet 上的联合
【发布时间】:2010-06-14 21:18:26
【问题描述】:

我一直在寻找一种在 django 中合并查询集的方法。根据我的阅读,您可以使用 query1 | query2 采取联合...不过,这在使用 values() 时似乎不起作用。我会跳过使用值,直到采用联合之后,但我需要使用注释来获取字段的总和并对其进行过滤,并且由于无法进行“分组”,所以我必须使用值()。我读到的其他建议是使用 Q 对象,但我想不出一种可行的方法。

我真的需要直接使用 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

但这不起作用,据我所知,我需要“值”部分,因为 Sum 没有其他方法可以知道如何操作,因为它是一个 15 列的表。

【问题讨论】:

    标签: python sql django


    【解决方案1】:

    QuerySet.values() 不返回QuerySet,而是返回ValuesQuerySet,不支持此操作。将它们转换为lists 然后添加它们。

    query = list(q1) + list(q2)
    

    【讨论】:

    • 这与联合有点不同...如果 q1 和 q2 有重叠,我最终会在查询中出现重复的条目。我试过 set(q1) | set(q2) 但字典本身是可散列的。
    • 这里有很多技术可以在 Python 中获得两个列表的正确联合,即使是不可散列的类型。或者在最坏的情况下,您可以使用 Schwartzian 变换并将它们全部放在一个字典中。 en.wikipedia.org/wiki/Schwartzian_transform
    猜你喜欢
    • 2011-07-08
    • 2014-06-28
    • 2011-09-29
    • 2014-08-12
    • 2015-02-28
    • 2010-09-11
    • 2023-03-27
    • 2013-07-13
    • 1970-01-01
    相关资源
    最近更新 更多