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'))

match[0].total_points 现在返回一场比赛的总分,我需要将每场比赛的总分相加,然后除以总比赛。

谢谢您的帮助!

4

2 回答 2

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
于 2012-11-26T00:58:12.937 回答
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}
于 2017-03-16T16:49:21.477 回答