Получение полей «многие ко многим» объекта «многие ко многим»

Если у меня есть отношение пользователь-группа как отношение ManyToMany и отношение группа-команда как отношение ManyToMany, как мне найти отношение пользователь-группа как объект запроса?

Например, если бы у меня был файл models.py, подобный этому:

class Group(models.Model):
    name = CharField(max_length=100)


class User(models.Model):
    username = models.CharField(max_length=100)
    groups = models.ManyToManyField(Group, blank=True)


class Team(models.Model):
    teamname = models.CharField(max_length=100)
    groups = models.ManyToManyField(Group, blank=True)

Я знаю, что могу сделать это, создав цикл for, как показано ниже, но было бы гораздо полезнее, учитывая архитектуру django, использовать его как объект запроса.

Мое уродливое решение:

user = User.objects.get(username="Ed")
users_teams = []
user_groups = Group.objects.filter(user=user)
for group in user_groups:
    group_teams = Team.objects.filter(group=group)
    for team in group_teams:
        user_teams.append(team)

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

Я бы предпочел что-то похожее на это:

User.objects.get(username="Ed").groups.team_set.objects.all()

что точно не работает. Любые идеи?


person joedurbak    schedule 07.07.2017    source источник


Ответы (1)


Team.objects.filter(groups__user__username="Ed")

который генерирует вас:

SELECT
  `api_team`.`id`,
  `api_team`.`teamname`
FROM `api_team`
  INNER JOIN `api_team_groups` ON (`api_team`.`id` = `api_team_groups`.`team_id`)
  INNER JOIN `api_group` ON (`api_team_groups`.`group_id` = `api_group`.`id`)
  INNER JOIN `api_user_groups` ON (`api_group`.`id` = `api_user_groups`.`group_id`)
  INNER JOIN `api_user` ON (`api_user_groups`.`user_id` = `api_user`.`id`)
WHERE `api_user`.`username` = 'ed'
person deathangel908    schedule 07.07.2017