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 的链接。 好的,但还没有和你在一起。我按照您的建议尝试了过滤器,但出现错误:无法将关键字“团队”解析为字段 使用您提供的模型,我的查询工作(我刚刚将它们复制并粘贴到一个新应用程序中并尝试了它)。请注意,复数很重要 - 您有 TeamDocuments。此外,您需要将您的应用程序放在 INSTALLED_APPS 中,以便添加用户的引用。

以上是关于Django:通过另一个多对多关系访问多对多对象的主要内容,如果未能解决你的问题,请参考以下文章

如何访问 django 多对多关系的连接表/对象

如何从 django 模板访问多对多“通过”表的属性?

Django 从多对多关系中删除对象

Django ORM - 通过模型查询多对多?

在 Django Admin 中过滤多对多框

在多对多关系对象django的对象中获取null