Django 聚合:在一个日期范围内分组和求和

Django aggregation: Group and sum over a date range

我每天获取一些用户统计数据并将它们记录在模型中,如下所示(为简单起见,不相关的部分被剥离):

class User(models.Model):
    group = models.CharField(
        choices=(('A', 'Group A'), ('B', 'Group B'),
    ))

class Stats(models.Model):
    day = models.DateField()
    user = models.ForeignKey(User)
    follower_count = models.PositiveIntegerField()

如上所示,每个用户都属于一个组。

如何获得每个用户在某个日期范围内每个 follower_count 总和?

换句话说,使用这些模型构建如下数据结构的最佳方法是什么?是否可以通过单个聚合查询来完成?

[{
    'date': '2015-07-15',
    'Group A': 26,  # sum of followers of users in Group A on 2015-07-15
    'Group B': 15,
 }, {
    'date': '2015-07-16',
    'Group A': 30, 
    'Group B': 18,
 }, {
    'date': '2015-07-17',
    'Group A': 32, 
    'Group B': 25,
 }]

谢谢。

您应该能够使用此代码块获得所需的聚合查询。

Stats.objects.values('day').annotate(
    group_a=Sum(Case(When(user__group='A', then='follower_count'))),
    group_b=Sum(Case(When(user__group='B', then='follower_count')))
)

基本上它告诉 Django ORM 获取两组 A 和 B 的 follower_count 的总和,列别名将分别为 "group_a" 和 "group_b" .聚合将通过使用 'day' 字段的 GROUP BY 执行。

生成的查询集将为您提供所需的详细信息。剩下的只是格式化。您可以使用基本的 JSON serializer Django provides to get the format you want, but if it is for a Web API, you might want to take a look at Django REST Framework,尤其是序列化程序。