Django:通过另一个多对多关系访问多对多对象
Posted
技术标签:
【中文标题】Django:通过另一个多对多关系访问多对多对象【英文标题】:Django: Accessing Many to Many object through another Many to Many relationship 【发布时间】:2012-04-30 05:50:18 【问题描述】:我已将我的模型简化为 a,以便更清楚地了解我想要做什么。
(应用团队中的models.py)
from django.db import models
from django.contrib.auth.models import User
import datetime
class Team(models.Model):
users = models.ManyToManyField(User)
team_title = models.CharField(max_length=200)
team_description = models.CharField(max_length=200)
def __unicode__(self):
return self.team_title
(应用文档中的models.py)
from django.db import models
import datetime
class Document(models.Model):
teams = models.ManyToManyField("Teams.Team", blank=True)
document_title = models.CharField(max_length=200)
document_description = models.TextField()
def __unicode__(self):
return self.document_title
我想要实现的是通过首先获取与文档关联的所有团队,然后获取与这些团队关联的所有用户,来获取与文档关联的用户列表。
到目前为止,我的尝试都是这样的
(在应用文档中查看.py)
from django.contrib.auth.models import User
from Documents.models import *
from Teams.models import *
def docUsers(request, doc_id):
current_document = Documents.objects.get(pk = doc_id)
associated_users = current_document.teams.all().users
....
错误:“QuerySet”对象没有“用户”属性
associated_users = current_document.items.all().users.all()
错误:“QuerySet”对象没有“用户”属性
associated_users = current_document.items.users.all()
错误:“ManyRelatedManager”对象没有“用户”属性
我是不是走错了路?
【问题讨论】:
【参考方案1】:嗯,是的。 current_document.teams.all()
是一个查询集 - 或多或少是一个团队列表。请求current_document.teams.all().users
是没有意义的,因为查询集本身没有“用户”属性,因此会出现错误。 users
是每个 Team 元素 within 该查询集的一个属性。因此,一种方法是遍历查询集并询问与每个团队关联的用户。
但是,这将是非常低效的 - 每个团队调用一次数据库。更好的方法是直接询问数据库:给我与当前文档相关联的团队中的所有用户。像这样:
User.objects.filter(team__documents=current_document)
【讨论】:
我还是一头雾水。 Team 模型与 Documents 模型的关联是从文档到团队,而不是相反,(我知道这不是最合乎逻辑的方法,但我不允许更改模型结构),那么我该如何过滤 team__documents? @agf 1. 不,您在过滤器表达式中使用实际模型名称。 2. 不,您使用 = 在 M2M/FK 关系中查找单个元素。见lookups that span relationships。 @Finglish 您可以访问双方的关系。请参阅我提供给 agf 的链接。 好的,但还没有和你在一起。我按照您的建议尝试了过滤器,但出现错误:无法将关键字“团队”解析为字段 使用您提供的模型,我的查询工作(我刚刚将它们复制并粘贴到一个新应用程序中并尝试了它)。请注意,复数很重要 - 您有Team
和 Documents
。此外,您需要将您的应用程序放在 INSTALLED_APPS 中,以便添加用户的引用。以上是关于Django:通过另一个多对多关系访问多对多对象的主要内容,如果未能解决你的问题,请参考以下文章