Django 获取集合中对象多对多字段的计数

Django get count of object many to many field in a set

我似乎无法理解 django 中稍微复杂的查询。

我有一个玩家玩过游戏。 每个 play 都有一个多对多字段,players 玩了那个游戏

对于 player1,我如何计算他使用 django orm 与哪个对手打得最多?

在SQL中,我想这可以从多对多table中计算出来,比如:

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

编辑: 在我在 post 中解释 SQL 可能类似于对多对多 table 的查询之后,我对 google 术语有了一些新想法。

我会再试一次,如果我很快得到它,我会回答我自己的问题。 昨晚我为此大发雷霆,但可能只需要新的一天。在 post.

之前,我需要一只可以与之交谈的橡皮鸭

编辑2: 我 post 在下面编辑了自己的答案,仍然很乐意接受建议。

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

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

这显然是 returns player_ids 的列表并计数,但是添加 order_byfirst 就可以了。