django通过注释数据分组

时间:2019-08-29 05:51:26

标签: django orm django-queryset

我有一个结果查询集,其中包含带注释的数据。我想进一步按小时分组,并希望将小时的另一个列号相加。 例如,我有一个查询集:-

<QuerySet [{'hour': 10, 'num_time': 101}, {'hour': 10, 'num_time': 1}, {'hour': 10, 'num_time': 2}, {'hour': 10, 'num_time': 4}, {'hour': 10, 'num_time': 1}, {'hour': 10, 'num_time': 13}, {'hour': 10, 'num_time': 6}, {'hour': 10, 'num_time': 2}, {'hour': 10, 'num_time': 3}, {'hour': 10, 'num_time': 8}, {'hour': 10, 'num_time': 4}, {'hour': 10, 'num_time': 6}, {'hour': 10, 'num_time': 1}, {'hour': 10, 'num_time': 3}, {'hour': 10, 'num_time': 18}, {'hour': 10, 'num_time': 3}, {'hour': 10, 'num_time': 19}, {'hour': 10, 'num_time': 3}, {'hour': 10, 'num_time': 14}, {'hour': 10, 'num_time': 4}, '...(remaining elements truncated)...']>

我想要以下结果:-

[{'hour': 10, 'num_time' : 210},{'hour': 18, 'num_time': 30}]

如何使用Django queryset实现?

这是我对第一个查询集重新排序的查询:-

table_name.objects.filter(id=id,created_time__isnull=False,day__range=[(date.today()-timedelta(days=30)),date.today()]).annotate(hour=ExtractHour('created_time'),num_time = Sum('A') + Sum('B') + Sum('C') + Sum('D')).values('hour', 'num_time').order_by('hour')

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

将查询结尾更改为仅按hour分组,而不按num_time分组并再次注释:

table_name.objects\
    .filter(
        id=id
        created_time__isnull=False, 
        day__range=[(date.today()-timedelta(days=30)),date.today()])\
    .annotate(
        hour=ExtractHour('created_time'),
        num_time = Sum('A') + Sum('B') + Sum('C') + Sum('D'))\
    .values('hour')\
    .annotate(total_time = Sum('num_time'))\
    .order_by('hour')