Django groupby day用0填充丢失的数据

时间:2019-12-21 18:30:33

标签: python django

我想在Django中按天分组的请求,但我想用0填充没有结果的那一天,有可能吗?

# I use the following query
AccessLog
 .objects
 .filter(attempt_time__gte=last_30_days)
 .annotate(day=TruncDay('attempt_time'))
 .values('day', 'username')
 .annotate(c = Count('username'))
 .order_by('day')

1 个答案:

答案 0 :(得分:1)

否,使用注释是不可能的。注释可用于相似类型,例如,Coalesce函数需要相似的类型,并且混合日期时间和数字将导致数据库错误。与Case函数相同,每个结果只有一个输出字段。

函数TruncDay返回一个DateTime(在这种情况下),其中字段Day的最小值设置为DateTime,因此例如2015-06-15 14:30:50.000321+00:00将转换为2015-01-01 00:00:00+00:00文档概述。并且实际注释的值有时不能是整数,有时不能是datetime对象。

在这种情况下,有时表示值是“ None”(无),更可取的方法是将其设置为最小值/最大值(我们假定该值不能等于它),例如:

AccessLog.objects.filter(
        attempt_time__gte=last_30_days
    ).annotate(
        day=Coalesce(TruncDay('attempt_time'), datetime.min)
    ).values('day', 'username').annotate(
        c=Count('username')
    ).order_by('day')