我有两种模式:运动员和锦标赛。
玩家也有他们玩的游戏类型(dota,lol,魔术等等)。他们可以同时参加许多比赛(每次比赛只有一次)。为了管理这些铭文,我使用了另一个名为TournamentMatch的模型,它为每个铭文创建一个新的对象,上面有锦标赛的ID和玩家的ID。
class Player(models.Model):
name = models.CharField(_('name'), max_length=150, null=True, blank=True)
email = models.EmailField(_('email address'), unique=True)
is_dota_player = models.BooleanField(default=False)
is_lol_player = models.BooleanField(default=False)
is_magic_player = models.BooleanField(default=False)
class Tournament(models.Model):
name = models.CharField(max_length=200)
date_start = models.DateField()
date_end = models.DateField()
class TournamentMatch(models.Model):
tournament = models.ForeignKey(Tournament)
player = models.ForeignKey(Player)
date_added = models.DateTimeField(auto_now_add=True)
date_modified = models.DateTimeField(auto_now=True)我想数一数比赛中有两个以上铭文的球员人数,例如,多塔球员。。
对于每个播放器,我可以很容易地使用for循环来实现这一点,但是出于性能上的原因,我希望使用Django查询来实现这一点。
例如,如果我想数一下有一个或多个铭文的dota玩家,我会这样做:
TournamentMatch.objects.filter(
player__is_dota_player=True
).distinct(
'player'
).count()我确信这是可能的,但我不知道如何计算每一个不同球员在比赛中的数量,并且只过滤那些有不止一个(而不仅仅是一个)的球员。
我将感谢任何帮助或指点!
发布于 2019-06-25 13:53:33
# subquery for counting match per player (note OuterRef which will be linked to the outer query row)
player_match_count_subquery = TournamentMatch.objects.filter(player_id=OuterRef('pk'), ).\
annotate(match_count=Count('pk'), ).values('match_count', )[:1]
# the main (outer) query which uses subquery output for filtering
Players.objects.filter(is_dota_player=True, ).\
annotate(match_count=Subquery(player_match_count_subquery), ).\
filter(match_count__gt=2, )https://docs.djangoproject.com/en/2.2/ref/models/expressions/#subquery-expressions
此代码将在逻辑上生成此SQL查询:
SELECT p.*, tm.match_count
FROM players p
CROSS APPLY (
SELECT COUNT(id) match_count
FROM tournamentmatch tm
WHERE tm.player_id = p.id
) tm
WHERE p.is_dota_player = $true
AND tm.match_count > 2https://stackoverflow.com/questions/56745089
复制相似问题