【问题标题】:Django ORM: Chaining aggregated querysets into oneDjango ORM:将聚合的查询集链接成一个
【发布时间】:2010-12-02 12:39:29
【问题描述】:

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

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 不支持这个。

【问题讨论】:

    标签: django orm aggregate chaining django-queryset


    【解决方案1】:

    您可以使用 | 组合查询集和 & 运算符:

    # 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/

    【讨论】:

      【解决方案2】:

      我建议使用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')
      

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

      【讨论】:

      • 谢谢汤姆,但这不是我想要的。 value_1 和 value_2 对各自月份的所有 gbp_value 求和。如何链接这两个聚合查询集?
      猜你喜欢
      • 2020-08-28
      • 2014-02-23
      • 2021-09-18
      • 2019-02-11
      • 1970-01-01
      • 2012-05-19
      • 2020-12-24
      • 2021-07-25
      • 1970-01-01
      相关资源
      最近更新 更多