【问题标题】:Getting the many-to-many fields of a many-to-many object获取多对多对象的多对多字段
【发布时间】:2017-12-12 07:34:10
【问题描述】:

如果我将用户-组关系作为多对多关系,将组-团队关系作为多对多关系,我将如何找到作为查询对象的用户-团队关系?

例如,如果我有一个这样的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()

这绝对行不通。 有什么想法吗?

【问题讨论】:

    标签: python django django-models django-orm


    【解决方案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'
    

    【讨论】:

      猜你喜欢
      • 2012-10-31
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      相关资源
      最近更新 更多