2012-04-18 23 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 

क्या मैं प्राप्त करने के लिए है, जो के साथ जुड़े रहे उपयोगकर्ताओं की सूची हो रही है चाहते हैं पहले दस्तावेज से जुड़े सभी टीमों को प्राप्त करने वाला दस्तावेज़ और फिर उन टीमों से जुड़े सभी उपयोगकर्ताओं को प्राप्त करना।

मेरे प्रयास अब तक इस

(एप्लिकेशन दस्तावेज़ में 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() 
है

त्रुटि: 'क्वेरीज़ेट' ऑब्जेक्ट में कोई विशेषता नहीं है 'उपयोगकर्ता'

associated_users = current_document.items.users.all() 

त्रुटि: 'ManyRelatedManager' ऑब्जेक्ट कोई विशेषता 'उन'

मैं गलत तरीके से इस बारे में जा रहा हूँ है?

उत्तर

13

ठीक है, हाँ। current_document.teams.all() एक क्वेरीसेट है - अधिक या कम, एक सूची - टीमों की। current_document.teams.all().users के लिए पूछना समझ में नहीं आता है, क्योंकि एक क्वेरीसेट में स्वयं 'उपयोगकर्ता' विशेषता नहीं है, इसलिए त्रुटि। users क्वेरी टीम के के भीतर प्रत्येक टीम तत्व की विशेषता है। तो, ऐसा करने का एक तरीका क्वेरीसेट के माध्यम से फिर से शुरू करना होगा और प्रत्येक टीम से जुड़े उपयोगकर्ताओं से पूछना होगा।

हालांकि, यह निराशाजनक रूप से अक्षम होगा - प्रत्येक टीम के लिए एक डेटाबेस कॉल। डेटाबेस से सीधे पूछना एक बेहतर तरीका है: मुझे उन सभी उपयोगकर्ताओं को दें जो वर्तमान दस्तावेज़ से जुड़े टीमों में हैं। इस तरह:

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

मैं अभी भी उलझन में हूं। दस्तावेज़ मॉडल के साथ टीम मॉडल एसोसिएशन दस्तावेज़ों से टीम तक है, दूसरी तरफ नहीं, (मुझे पता है कि यह सबसे तार्किक दृष्टिकोण नहीं है, लेकिन मुझे मॉडल संरचना बदलने की अनुमति नहीं है), तो मैं टीम के दस्तावेज़ कैसे फ़िल्टर कर सकता हूं? – Finglish

+1

@agf 1. नहीं, आप फिल्टर अभिव्यक्ति के अंदर वास्तविक मॉडल नामों का उपयोग करते हैं। 2. नहीं, आप एम 2 एम/एफके रिलेशनशिप के भीतर एक तत्व को देखने के लिए = का उपयोग करते हैं। देखें [लुकअप जो संबंधों को फैलाता है] (https://docs.djangoproject.com/en/1.3/topics/db/queries/#lookups-that-span-relationships)। –

+0

@ फ़िंग्लिश आप दोनों तरफ से रिश्तों तक पहुंच सकते हैं। एएफएफ को दिए गए लिंक को देखें। –

संबंधित मुद्दे