获取多对多对象的多对多字段 [英] Getting the many-to-many fields of a many-to-many object

查看:61
本文介绍了获取多对多对象的多对多字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我将用户-组关系作为ManyToMany关系,将组-团队关系作为ManyToMany关系,那么我如何将用户-团队关系作为查询对象呢?

If I have the user-group relation as a ManyToMany relationship, and a group-team relation as a ManyToMany relationship, how would I find the user-team relation as a query object?

例如,如果我有这样的models.py:

For example if I had a models.py like this:

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的体系结构,将其作为查询对象会更有用。

I know I can do it by creating a for loop like follows, but it would be much more useful given django's architecture to have it as a query object.

我的丑陋解决方案:

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)

所以这会给我一个可以与用户关联的列表查询对象,但事实并非如此易于用作单个查询集,它包含每个用户团队关系的包含查询对象。

So this would give me a list query objects that I could associate with a user, but it isn't as easy to use as a single query set the contains query objects for each user-team relation.

我希望使用类似以下内容的东西:

I would prefer something that looks like this:

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

这绝对不起作用。
有什么想法吗?

which definitely doesn't work. Any ideas?

推荐答案

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'

这篇关于获取多对多对象的多对多字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆