Django получает количество объектов многие ко многим в наборе - PullRequest
1 голос
/ 14 марта 2019

Кажется, я не могу обернуться легкомысленными вопросами в django.

У меня есть игрок с сыгранными играми . каждая игра имеет поле «многие ко многим» с игроками , которые играли в эту игру .

С игроком 1, как мне рассчитать, с каким противником он сыграл больше всего с Джанго Ормом?

В 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')

Суть моделей

EDIT: После того, как я объяснил в своем посте, что SQL может быть чем-то вроде запроса к таблице «многие ко многим», я получил несколько новых идей для терминов Google.

Я еще раз пойду и отвечу на свой вопрос, если скоро получу. Я бился головой об этой прошлой ночью, но новый день мог быть всем, что было нужно. Мне нужна резиновая утка, с которой я могу поговорить до публикации.

EDIT2: Я отправил свой собственный ответ ниже, все еще рад принять предложения.

1 Ответ

0 голосов
/ 14 марта 2019

Возвращает значения, которые мне нужны, если у кого-то есть идея получше, я был бы рад принять чей-либо ответ.

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_by и first и мы там.

...