2011-02-03 11 views
5

मैं Django डॉक्स से कोड का पालन करने की कोशिश कर रहा हूँ के साथ लुकअप उल्टा:Django - ManyToManyField

class Person(models.Model): 
    name = models.CharField(max_length=128) 

    def __unicode__(self): 
     return self.name 

class Group(models.Model): 
    name = models.CharField(max_length=128) 
    members = models.ManyToManyField(Person, through='Membership') 

    def __unicode__(self): 
     return self.name 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    date_joined = models.DateField() 
    invite_reason = models.CharField(max_length=64) 


>>> ringo = Person.objects.create(name="Ringo Starr") 
>>> paul = Person.objects.create(name="Paul McCartney") 
>>> beatles = Group.objects.create(name="The Beatles") 
>>> m1 = Membership(person=ringo, group=beatles, 
...  date_joined=date(1962, 8, 16), 
...  invite_reason= "Needed a new drummer.") 
>>> m1.save() 
>>> beatles.members.all() 
[<Person: Ringo Starr>] 
>>> ringo.group_set.all() 

मेरे मॉडल इस तरह दिखता है:

class Trip(models.Model): 
    members = models.ManyToManyField(User,blank=True,null=True,through='TripReservation') 

लेकिन जब मैं user.group_set कहते हैं। सभी() किसी दिए गए उपयोगकर्ता उदाहरण के लिए, मुझे एक त्रुटि मिलती है कि कोई विशेषता नहीं है group_set

+1

आप अभी तक की कोशिश की 'trip_set'? –

+0

मैंने किया लेकिन मुझे लगता है कि मैंने डीबी का पुनर्निर्माण नहीं किया था, इसलिए यह काम नहीं किया, लेकिन डीबी के पुनर्निर्माण के बाद इसे काम करने के लिए मिला! क्या मैं इसे टेम्पलेट से कॉल कर सकता हूं? उदाहरण के लिए यदि मैं देखना चाहता हूं कि कोई यात्रा "request.user.trip_set.all" में है या नहीं, तो मैं यह कैसे करूँगा? – JPC

+0

@jpc - ऐसा लगता है कि आप इस प्रश्न को अगले अंक में – MattoTodd

उत्तर

4

सबसे पहले, क्या आप मॉडल के माध्यम से उपयोग कर रहे हैं? आप वहां से हैं, लेकिन आपने इसे सूचीबद्ध नहीं किया है। यदि आप नहीं हैं तो आपको इसकी आवश्यकता नहीं है।

मैं एक related_name जोड़ना होगा, इसलिए जैसे:

class Trip(models.Model): 
    members = models.ManyToManyField(User,blank=True,null=True, related_name='user_trips') 

तो फिर तुम फोन करने के लिए सक्षम होना चाहिए:

user.user_trips.all() 

मैं इसे 'user_trips' नहीं बल्कि 'यात्राएं' से कहा जाता है, क्योंकि अगर यह नहीं एक अनोखा नाम नहीं है जिससे यह विवाद पैदा कर सकता है।

आप मॉडल के माध्यम से एक का उपयोग कर रहे हैं, तो इसे और अधिक इस प्रकार दिखाई देगा:

#User is defined in django.auth 

class Trip(models.Model): 
    members = models.ManyToManyField(User,blank=True,null=True, related_name='user_trips', through='TripReservation') 

class TripReservation(models.Model): 
    user = models.ForeignKey(User) 
    trip = models.ForeignKey(Trip) 
    registered = models.DateField() 

समझ लें कि इस तरह के साथ, TripReservation ट्रिप, न कि पूरी यात्रा के लिए एक विशेष उपयोगकर्ता आरक्षण को संदर्भित करता है, और यात्रा के बारे में जानकारी ट्रिप मॉडल पर ही संपत्ति होनी चाहिए। तो, TripReservation.registered, वह तब होता है जब वह विशेष उपयोगकर्ता यात्रा के लिए पंजीकृत होता है।

उपयोगकर्ता यात्राएं देखने ही होगा:

user.user_trips.all() 
संबंधित मुद्दे