获取多对多对象的多对多字段
Getting the many-to-many fields of a many-to-many object
如果我将用户-组关系作为多对多关系,将组-团队关系作为多对多关系,我如何找到用户-团队关系作为查询对象?
例如,如果我有这样的 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()
这绝对行不通。
有什么想法吗?
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'
如果我将用户-组关系作为多对多关系,将组-团队关系作为多对多关系,我如何找到用户-团队关系作为查询对象?
例如,如果我有这样的 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()
这绝对行不通。 有什么想法吗?
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'