代码之家  ›  专栏  ›  技术社区  ›  joedurbak

获取多对多对象的多对多字段

  •  0
  • joedurbak  · 技术社区  · 7 年前

    例如,如果我有一个模型。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()
    

    有什么想法吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   deathangel908    7 年前
    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'