1
我想建立一个表格来聚合基于用户ID的统计信息。这是第一次提出问题,所以如果我错过任何重要的事情,请耐心等待。Django Calculate Aggregated Totals
这里是模型:
class Batting(models.Model):
player = models.ForeignKey(
'Player',
on_delete=models.CASCADE,
null=True,
)
game = models.ForeignKey(
'Game',
on_delete=models.CASCADE,
null=True,
blank=True,
)
season = models.ForeignKey(
'Season',
on_delete=models.CASCADE,
null=True,
)
games_played = models.IntegerField(
blank=True,
default=1,
)
plate_appearances = models.IntegerField(
blank=True,
default=0,
)
at_bats = models.DecimalField(
default=0,
max_digits=6,
decimal_places=3,
)
hits = models.DecimalField(
blank=True,
max_digits=6,
decimal_places=3,
default=0,
)
...
batting_average = models.DecimalField(
max_digits=6,
decimal_places=3,
editable=False,
null=True
)
slugging_percentage = models.DecimalField(
max_digits=6,
decimal_places=3,
editable=False,
null=True
)
on_base_percentage = models.DecimalField(
max_digits=6,
decimal_places=3,
editable=False,
null=True
)
on_base_plus_slugging_percentage = models.DecimalField(
max_digits=6,
decimal_places=3,
editable=False,
null=True
)
def save(self, *args, **kwargs):
self.total_bases = self.singles + (self.doubles * 2) + (self.triples * 3) + (self.home_runs * 4)
self.extra_base_hits = self.doubles + self.triples + self.home_runs
self.batting_average = float(self.hits)/float(self.at_bats)
self.slugging_percentage = self.total_bases/float(self.at_bats)
self.on_base_percentage = (self.hits + self.base_on_balls + self.hit_by_pitch)/float(self.at_bats + self.base_on_balls + self.sacrifice_flys + self.hit_by_pitch)
self.on_base_plus_slugging_percentage = (self.hits + self.base_on_balls + self.hit_by_pitch)/float(self.at_bats + self.base_on_balls + self.sacrifice_flys + self.hit_by_pitch)
super(Batting, self).save(*args, **kwargs)
class Meta:
verbose_name = u'Batting Stat'
verbose_name_plural = u'Batting Stats'
def __unicode__(self):
return self.player.last_name
这里是视图:
def stats(request):
batting_stats = Batting.objects.values('player__id').annotate(
fn=F('player__first_name'),
ln=F('player__last_name'),
total_hits=Sum(('hits'),output_field=FloatField()),
total_at_bats=Sum(('at_bats'),output_field=FloatField()),
avg=Avg('batting_average'),
slg=Avg('slugging_percentage'),
obp=Avg('on_base_percentage'),
ops=Avg('on_base_plus_slugging_percentage'),
)
return render(request, 'stats.html', {
'batting_stats': batting_stats,
})
我遇到的问题是,AVG,SLG,OBP,与OPS是模型中的所有计算并且在视图中对它们进行平均可以对平均值进行平均,而不是根据玩家ID计算总计。
我试过利用聚合函数,但还没有找到一种方法来使它工作。有没有一种方法可以结合使用注释和聚合,这将允许我合并单个玩家ID下的统计数据并将这些相同的计算应用于总数?
感谢您的回复 - 这是一个非常类似的答案,我从昨天晚上和一位朋友刚刚讨论过的问题中得到了一个类似的答案,所以我认为我有一个关于如何解决问题的好主意(在您的示例中提供帮助)。 – whob13