Django:通过另一个多对多关系访问多对多对象

时间:2012-04-18 18:40:18

标签: django django-models many-to-many django-views

我简化了我的模型,以便更清楚我想要做的事情。

(应用团队中的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

我想要实现的是获取与文档关联的用户列表,方法是首先获取与文档关联的所有团队,然后从中获取与这些团队关联的所有用户。

到目前为止,我的尝试已经类似这样了

(应用文档中的view.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'对象没有属性'users'

associated_users = current_document.items.all().users.all()

错误:'QuerySet'对象没有属性'users'

associated_users = current_document.items.users.all()

错误:'ManyRelatedManager'对象没有属性'users'

我是以错误的方式来做这件事的吗?

1 个答案:

答案 0 :(得分:15)

嗯,是的。 current_document.teams.all()是一个查询集 - 或多或少,列表 - 团队。请求current_document.teams.all().users是没有意义的,因为查询集本身没有'users'属性,因此错误。 users是中每个Team元素的一个属性。因此,一种方法是遍历查询集并请求与每个团队关联的用户。

然而,这将是无可救药的低效率 - 每个团队的一个数据库调用。更好的方法是直接询问数据库:向我提供与当前文档关联的所有团队用户。像这样:

User.objects.filter(team__documents=current_document)