我每天都会获取一些用户统计信息并将其记录在模型中,如下所示(为简单起见,不相关的部分被删除):
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,
}]
谢谢。
答案 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,尤其是序列化程序。