Django聚合:对日期范围进行分组和求和

时间:2015-07-19 20:42:53

标签: django django-queryset django-aggregation

我每天都会获取一些用户统计信息并将其记录在模型中,如下所示(为简单起见,不相关的部分被删除):

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()

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

如何在一个日期范围内获取每个用户{strong}组的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,
 }]

谢谢。

1 个答案:

答案 0 :(得分:3)

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

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"分别。聚合将使用GROUP BY使用' day'进行。领域。

生成的查询集将为您提供所需的详细信息。其余的只是格式化。您可以使用基本的JSON serializer Django provides来获取所需的格式,但如果是用于Web API,则可能需要查看Django REST Framework,尤其是序列化程序。