-1

为了开始使用 Django,我使用它为我的垒球队构建了一个小站点,我们可以在其中列出每个球员的统计数据。对于模型,我定义了 2 个表 - Player 和 Statline,其中 Statline 中的玩家是外键。

class Player(models.Model):
    name = models.CharField(max_length=32)
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
    bats = models.CharField(max_length=1, choices=HANDED_CHOICES)
    throws = models.CharField(max_length=1, choices=HANDED_CHOICES)
    position = models.CharField(max_length=2, choices=POSITION_CHOICES)
    pitches = models.CharField(max_length=1, choices=PITCHES_CHOICES)
    hometown = models.CharField(max_length=32)

    def __unicode__(self):
        return self.name

class StatLine(models.Model):
    season_name = models.CharField(max_length=12, choices=SEASON_CHOICES)
    player = models.ForeignKey(Player)
    at_bats = models.IntegerField(max_length=2, choices=NUMBER_CHOICES, default=0)
    singles = models.IntegerField(max_length=2, choices=NUMBER_CHOICES, default=0)
    doubles = models.IntegerField(max_length=2, choices=NUMBER_CHOICES, default=0)
    triples = models.IntegerField(max_length=2, choices=NUMBER_CHOICES, default=0)
    homeruns = models.IntegerField(max_length=2, choices=NUMBER_CHOICES, default=0)
    runs = models.IntegerField(max_length=2, choices=NUMBER_CHOICES, default=0)
    rbis = models.IntegerField(max_length=2, choices=NUMBER_CHOICES, default=0)
    rboe = models.IntegerField(max_length=2, choices=NUMBER_CHOICES, default=0)

我要做的是做一个查询,在其中总结每个玩家的所有统计数据并按玩家分组。这样我就可以对每个赛季的所有统计数据进行统计。当我用 PHP 构建网站时,在 SQL 中,它是:

FROM Stats
INNER JOIN Players ON Players.player_id = Stats.player_id 
WHERE season_name = 'Spring 2012'
GROUP BY Players.player_name

我对如何使用 Django 执行相同的查询感到困惑。任何帮助将非常感激!

4

1 回答 1

1

Django 关于聚合的文档应该足够了。

我不知道您为什么要分组,player_name因为您没有说明要选择哪些字段以及是否应该在某处进行聚合。一个对象可以有多个StatLine对象Player吗?

如果您希望为每个球员总结特定赛季的所有本垒打,您可以使用以下代码段:

from django.db.models import Sum
Player.objects.filter(
      statline__season_name="Spring 2012"
   ).annotate(
      sum_homeruns=Sum(statline__homeruns),
      sum_abats=Sum(statline__abats),
      sum_singles=Sum(statline__singl‌​es),
      […]
)

文档filter()中所述,和的顺序annotate()很重要。

于 2012-05-11T13:24:32.057 回答