Django在一组中得到多个对象的对象数

问题描述 投票:1回答:1

我似乎无法围绕django的轻微复杂的查询。

我有一个玩过游戏的玩家。每场比赛都有很多场比赛,有玩家参加比赛。

使用player1,我如何计算他用django orm打得最多的对手?

在SQL中我想这可以从多对多表中计算,例如:

SELECT player_id, count(*)
FROM play_player
WHERE play_id in (SELECT play_id FROM play_player WHERE player_id = 'player1_id')

这些是我的模特:

class Game(models.Model):
    """A game to be played and/or owned"""
    name = models.CharField(max_length=255)

class Player(models.Model):
    """Someone who plays games"""
    name = models.CharField(max_length=255)
    games = models.ManyToManyField(Game)

class Play(models.Model):
    """Players have played a game"""
    name = models.CharField(max_length=50, null=True, blank=True)
    description = models.TextField(max_length=250, null=True, blank=True)
    date = models.DateField(
        default=timezone.now, help_text='When was the game played?')
    game = models.ForeignKey(
        Game,
        on_delete=models.SET_NULL,
        null=True,
        help_text='What game was played?')
    players = models.ManyToManyField(Player, help_text='Who was playing?')
    winner = models.ForeignKey(
Player, on_delete=models.SET_NULL, null=True, related_name='winner')

Gist of models

编辑:在我的帖子中解释说SQL可能类似于多对多表上的查询,我得到了谷歌术语的一些新想法。

如果我很快得到的话,我会再接受一次,然后回答我自己的问题。昨晚我正在反对这一点,但新的一天可能就是所需要的。在发布之前,我需要找一个我能说话的橡皮鸭。

编辑2:我在下面发表了自己的答案,仍然乐于接受建议。

django django-models django-orm
1个回答
0
投票

这会返回我追求的价值,如果有人有更好的想法,我很乐意接受别人的回答。

def get_most_played_player(self):
    my_plays = self.play_set.all()
    my_plays_ids = [x.id for x in my_plays]
    players_and_count = Play.players.through.objects.filter(
        play_id__in=my_plays_ids).values('player_id').annotate(
            count=Count('player_id')).all()
    for p_c in players_and_count:
        print(t)
        # {'player_id: 1, 'count': 3}
        # etc
    return players_and_count

这显然会返回一个player_ids和count的列表,但是添加一个order_byfirst,我们就在那里。

© www.soinside.com 2019 - 2024. All rights reserved.