2015-07-19 36 views
1

我每日取一些用戶的統計信息和在模型中它們記錄如下(不相關的部分被剝離爲簡單起見):Django的聚合:組和總和在時間範圍

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 s的總和?

換句話說,使用這些模型構建如下數據結構的最佳方法是什麼?是否有可能通過單個聚合查詢來完成?

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

謝謝。

回答

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」。聚合將使用'day'字段與GROUP BY一起執行。

生成的查詢集將爲您提供所需的詳細信息。剩下的只是格式化。你可以使用基本的JSON serializer Django provides來獲得你想要的格式,但是如果它是用於Web API的,你可能想看看Django REST Framework,特別是序列化器。

+0

謝謝,太好了。我不知道Django 1.8附帶的新條件表達式。 – omat