2012-04-18 3 views
10

내가 뭘 하려는지 명확하게하기 위해 모델을 단순화했습니다.Django : Many to Many 다른 객체를 통해 많은 객체에 액세스하기 Many to Many 관계

(응용 프로그램 팀에서 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 

    .... 

오류 : '검색어 세트'목적이없는 속성 '사용자'

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

오류 : 'QuerySet'객체에는 'users'속성이 없습니다

associated_users = current_document.items.users.all() 

오류 : 'ManyRelatedManager'개체가 어떤 속성을 '사용자'가

내가 이것에 대해 잘못된 길을 가고없는 건가요있다?

답변

13

글쎄, 네. current_document.teams.all()은 queryset입니다. 더 많거나 적은 수의 팀 목록입니다. current_document.teams.all().users을 묻는 것은 의미가 없습니다. 쿼리 세트 자체에 '사용자'속성이 없으므로 오류가 발생합니다. users은 각 팀 요소 의 속성이며 내에있는 쿼리 세트입니다. 그래서, 그것을 수행하는 한 가지 방법은 쿼리 세트를 반복하고 각 팀과 관련된 사용자를 요청하는 것입니다.

그러나 이것은 비효율적 일 것입니다. 각 팀에 대해 하나의 데이터베이스 호출이 필요합니다. 훨씬 더 좋은 방법은 데이터베이스에 직접 물어 보는 것입니다 : 현재 문서와 관련된 팀에있는 모든 사용자를 제공하십시오. 이와 같이 :

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

나는 아직도 혼란 스럽다. 팀 모델과 문서 모델과의 연관성은 문서에서 팀까지이며 다른 방향으로 진행되는 것은 아닙니다. (가장 논리적 인 방법은 아니지만 모델 구조를 변경할 수는 없습니다.) team__ 문서를 필터링하려면 어떻게해야합니까? – Finglish

+1

@agf 1. 아니오, 필터 표현식 안에 실제 모델 이름을 사용합니다. 2. 아니요, =를 사용하여 M2M/FK 관계 내에서 단일 요소를 조회합니다. [관계에 관련된 조회] (https://docs.djangoproject.com/en/1.3/topics/db/queries/#lookups-that-span-relationships)를 참조하십시오. –

+0

@Finglish 당신은 양쪽에서 관계에 액세스 할 수 있습니다. 내가 agf에 준 링크를 참조하십시오. –