首页 > 解决方案 > Django获取集合中对象多对多字段的计数

问题描述

我似乎无法解决 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')

模型要点

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

我会再试一次,如果我很快得到它,我会回答我自己的问题。昨晚我正在为此猛烈抨击,但可能只需要新的一天。在我发帖之前,我需要找一只可以交谈的橡皮鸭。

EDIT2:我在下面发布了自己的答案,仍然很乐意接受建议。

标签: djangodjango-modelsdjango-orm

解决方案


这将返回我所追求的值,如果有人有更好的主意,我很乐意接受别人的回答。

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_byandfirst就可以了。


推荐阅读