使用Django ORM在一个查询中按组计数多列

时间:2018-10-14 18:39:00

标签: django django-models orm django-orm

我有一个表,该表有四列(创建,到期,激活,更新),数据类型为DateTime。我想要每个日期所有四列的计数数。

    String insertSQL = "INSERT INTO `news`( `title`, `date`, `description`) VALUES(?,?,?)";

    PreparedStatement ps = DBUtils.getPreparedStatement(insertSQL);
    ps.setString(1, n.getTitle());
    ps.setString(2, n.getDate());
    ps.setString(3, n.getDescription());

    int rs = ps.executeUpdate();


    if (rs > 0) {

        System.out.println("DB updated!");

    }

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

1 个答案:

答案 0 :(得分:1)

您可以使用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的键值对的QuerySet。