Django ORM:将聚合查询集链接到一个

时间:2009-09-30 03:01:38

标签: django orm aggregate chaining django-queryset

我可以将这两个查询集链接成一个吗?

qs1 = OrderTicket.objects.filter(date__gt=datetime.date(2009, 1, 1), date__lt=datetime.date(2009, 1, 30)).values('order_type').annotate(value_1 = Sum('gbp_value')).order_by('order_type'),
qs2 = OrderTicket.objects.filter(date__gt=datetime.date(2009, 2, 1), date__lt=datetime.date(2009, 2, 30)).values('order_type').annotate(value_2 = Sum('gbp_value')).order_by('order_type'),

我想要的只是value_1和value_2列。 Q对象不是我需要的。也许ORM不支持这个。

2 个答案:

答案 0 :(得分:2)

您可以使用|组合查询集和&运营商:

# You can combine queries with & and |.
>>> s1 = Article.objects.filter(id__exact=1)
>>> s2 = Article.objects.filter(id__exact=2)
>>> s1 | s2
[<Article: Area woman programs in Python>, <Article: Second article>]
>>> s1 & s2
[]

来源http://www.djangoproject.com/documentation/models/basic/

答案 1 :(得分:1)

我建议您使用Q objects替换date__gt和date__lt

的过滤器

示例(未测试):

qs1 = OrderTicket.objects
    .filter(  Q(date__gt=datetime.date(2009, 1, 1), date__lt=datetime.date(2009, 1, 30)) 
            | Q(date__gt=datetime.date(2009, 2, 1), date__lt=datetime.date(2009, 2, 30))
           )
    .values('order_type').annotate(value_1 = Sum('gbp_value')).order_by('order_type')

这应该返回您要查找的日期。