2012-04-18 37 views
10

私は何をしようとしているのかを明確にするためにモデルを単純化しました。Django:多対多のオブジェクトへのアクセス多対多の関係

(アプリのチームで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 

に関連付けられているユーザのリストを取得している私は何を達成したいです最初に文書に関連するすべてのチームを取得し、その後、これらのチームに関連するすべてのユーザーを取得することによって、文書を作成します。 'クエリセット' オブジェクトが無属性 'ユーザ'

associated_users = current_document.items.all().users.all() 
があります

私の試みは、これまでのところ、この

(アプリの書類で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.users.all() 

エラー:は 'ManyRelatedManager' オブジェクトが属性 'ユーザ'

私はこれについて間違った道を進んでいないアムたのか?

答えて

13

まあ、はい。 current_document.teams.all()は多かれ少なかれ、チームのリストです。 current_document.teams.all().usersを質問するのは意味がありません。クエリーセット自体には「ユーザー」属性がないため、エラーです。 usersは、各チーム要素の属性で、の中にそのクエリセットがあります。したがって、それを実行する1つの方法は、クエリーセットを反復して、各チームに関連付けられたユーザーを尋ねることです。

しかし、それは絶望的に非効率的です。つまり、チームごとに1つのデータベースが呼び出されます。もっと良い方法は、データベースに直接質問することです。チームにいるすべてのユーザーに現在のドキュメントを関連付けます。このように:

User.objects.filter(team__documents=current_document) 
+1

私はまだ混乱しています。チームモデルとドキュメントモデルとの関連付けは、文書からチームへのものであり、他の方法ではありません(これは最も論理的なアプローチではありませんが、モデル構造を変更することはできません)。 – Finglish

+1

@agf 1.いいえ、フィルター式の中で実際のモデル名を使用します。 2.いいえ、=を使用して、M2M/FK関係内の単一の要素をルックアップします。 [関係をまたぐルックアップ](https://docs.djangoproject.com/en/1.3/topics/db/queries/#lookups-that-span-relationships)を参照してください。 –

+0

@Finglishあなたは両側から関係にアクセスできます。私がagfに与えたリンクを見てください。 –