【问题标题】:Django aggregation: Group and sum over a date rangeDjango聚合:在日期范围内分组和求和
【发布时间】:2015-07-19 20:42:53
【问题描述】:

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

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_counts 总和?

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

[{
    '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,
 }]

谢谢。

【问题讨论】:

    标签: django django-queryset django-aggregation


    【解决方案1】:

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

    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 来获得您想要的格式,但如果是用于 Web API,您可能需要查看Django REST Framework,尤其是序列化程序。

    【讨论】:

    • 谢谢,太好了。我不知道 Django 1.8 附带的这个新条件表达式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    相关资源
    最近更新 更多