使用 Django ORM 在一个查询中使用 group by 计算多列

Count multiple columns with group by in one query using Django ORM

我有一个 table,它有四列(创建、过期、激活、更新),数据类型是 DateTime.I 想要每个日期所有四列的计数。

table1.objects.annotate(dt=Truncmonth('created')).values('dt').orderby().annotate(Count('dt'))
table1.objects.annotate(dte=Truncmonth('expires')).values('dte').orderby().annotate(Count('dte'))
table1.objects.annotate(dta=Truncmonth('activated')).values('dta').orderby().annotate(Count('dta'))
table1.objects.annotate(dtr=Truncmonth('renewed')).values('dtr').orderby().annotate(Count('dtr'))

以上是四个不同的查询,它们提供了日期及其计数。但我想获取所有列的日期和计数 我想要的是日期 count_dt,count_dte,count_dta,count_dtr。但是我得到 date_dt,date_dte,date_dta,date_dtr,count_dt,count_dte,count_dta ,count_dtr。 简而言之,我想结合以上四个查询。

您可以使用 Django 的 Coalesce 函数从所有日期列中选取第一个非空值,然后注释每个月份值的各种计数:

from django.db.models.functions import TruncMonth, Coalesce
from django.db.models import Count    

table1.objects.annotate(month=Coalesce(TruncMonth('created'), TruncMonth('expires'), TruncMonth('activated'), TruncMonth('renewed)))
    .values('month')
    .annotate(nc=Count('created'), ne=Count('expires'), na=Count('activated'), nr=Count('renewed')

输出是一个带有键值对的查询集 month, nc, ne, na, nr