2

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

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,
 }]

谢谢你。

4

1 回答 1

4

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

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 执行。

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

于 2015-07-20T05:09:39.723 回答