2012-11-26 100 views
2

说我有这两种模式:计数平均分

class Match(models.Model): 
    ... 

class Player(models.Model): 
    match=models.ForeignKey(Match) 
    points=models.IntegerField() 

我想计算每场比赛的平均分,这意味着我需要总结的所有玩家的点,然后把它通过比赛的数量。我很难搞清楚如何在Django中有效地做到这一点。

我试过谷歌搜索和搜索StackOverflow,但我很难找出我应该寻找什么条款。

match = Match.objects.annotate(total_points=Sum('player__points')) 

匹配[0] .total_points现在返回一个匹配的总点数,我需要总结每场比赛的total_points和由总匹配划分它。

感谢您的帮助!

回答

1

使用aggregate来总计积分总数,count()找到匹配的数量,然后用python除以得到每个匹配的平均点数。

from django.db.models import Sum 
total_points = Player.objects.aggregate(Sum('points'))['points__sum'] 
num_matches = Match.objects.count() 
average_points_per_match = total_points/num_matches 
+0

嘿,我很愚蠢。我一直在苦苦寻找解决方案,在单一查询中完成整个计算,我完全无视最明显的解决方案。 – ponycat

0

我认为这是可以更有效地解决了使用一个查询,如下所示

from django.db.models import Avg 
result = Match.objects.all().aggregate(Avg('score')) 

result 
{'score__avg': 4.012987012987013} 

我发现这个问题,而试图实现类似的事情,但也想知道有多少的平均分数匹配基于。我最终解决的问题如下。

result = Match.objects.all().annotate(num_matches=Count('id')).aggregate(Avg('score'), Sum('num_matches')) 

result 
{'num_matches__sum': 77, 'score__avg': 4.012987012987013}