我如何计算Django中的出现次数?

时间:2014-03-14 13:19:50

标签: django orm

以下是我项目中的模型:

class Tournament(models.Model):

    title = models.CharField(max_length=150)
    start_date = models.DateTimeField(verbose_name="Start date")
    end_date = models.DateTimeField(verbose_name="End date")
    participants = models.ManyToManyField(Participant)

    def __unicode__(self):
        return u"%s" % self.title


class Game(models.Model):

    tournament = models.ForeignKey(Tournament)
    number_of_tour = models.PositiveSmallIntegerField()
    opponent_white = models.ForeignKey(Participant, related_name='opponent_white', blank=True)
    opponent_black = models.ForeignKey(Participant, related_name='opponent_black', blank=True)
    winner = models.CharField(max_length=150, choices=(('White', 'White'), ('Black', 'Black'), ('Draw', 'Draw')), blank=True)
    elo_gained_white = models.FloatField(default=0)
    elo_gained_black = models.FloatField(default=0)

我的问题是我想知道每场锦标赛的参赛人数。我试图这样做:

num_of_tours = Game.objects.filter(tournament=tournament_id).annotate(Count('number_of_tour', distinct=True)).count()

但是这仍然会返回与锦标赛相关的锦标赛数量。你能告诉我这样做的方法吗?

感谢。

2 个答案:

答案 0 :(得分:0)

所以你想要特定锦标赛中所有游戏的Sumnumber_of_tour?我认为您可能需要aggregate而不是annotateSum而不是Count

num_of_tours = Game.objects.filter(tournament=tournament_id).aggregate(total_num=Sum('number_of_tour', distinct=True))['total_num']
编辑:Daniel Roseman指出number_of_tour可能是一个索引。这更有意义。我的错。您需要对整个查询执行不同的操作,然后对该查询进行计数。像这样:

num_of_tours = Game.objects.filter(tournament=tournament_id).distinct('number_of_tour').count()

这应该计算具有不同number_of_tour的游戏对象的数量。我相信这就是你想要的。对不起,感到困惑。

答案 1 :(得分:0)

我想我有解决方案:

他正在寻找的是每场比赛的number_of_tours的独特数量。 每个游戏都有一个游览值,但这些值可以是两倍。所以number_of_tours就像某种id一样。

Nervosa你可以得到如此明显的价值:

num_of_tours = Game.objects.filter(tournament=tournament_id).values('number_of_tour').distinct().count()

这应该只是给你:每场锦标赛的数量不同的number_of_tours