Django

2009-09-07 10 views
8

में इंटरमीडिएट मॉडल फ़ील्ड द्वारा m2m आइटम्स के लिए डिफ़ॉल्ट ऑर्डरिंग मुझे एक असामान्य समस्या है। इस तरह के मॉडल पर विचार करें (Django डॉक्स से लिया गया):Django

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) 

अब मान लें कि हम बाहर बीटल्स बैंड में 2 बीटल्स के सदस्यों मिल गया है चलो (मध्यवर्ती मॉडल के लिए Django डॉक्स में उदाहरण का पालन करना):

>>> beatles.members.all() 
[<Person: Ringo Starr>, <Person: Paul McCartney>] 

उपर्युक्त कोड व्यक्ति मॉडल के लिए डिफ़ॉल्ट ऑर्डरिंग द्वारा क्रमबद्ध सदस्यों को वापस कर देगा। यदि मैं निर्दिष्ट करता हूं:

>>> beatles.members.all().order_by('membership__date_joined') 

सदस्यों को शामिल तिथि के माध्यम से क्रमबद्ध किया जाता है। क्या मैं इसे इस ManyToMany फ़ील्ड के लिए डिफ़ॉल्ट व्यवहार के रूप में सेट कर सकता हूं? इंटरमीडिएट मॉडल में फ़ील्ड द्वारा संबंधित वस्तुओं का डिफ़ॉल्ट क्रम सेट करना है? ManyRelatedManager में एक init तर्क core_filters प्रतीत होता है, लेकिन मुझे कोई अस्पष्ट विचार नहीं है कि django में पूरे m2m फ़ील्ड के साथ इसे कैसे एक्सेस किया जाए। कोई रचनात्मक विचार? :)

अग्रिम में :)

धन्यवाद मैं एक ticket in django trac खोल दिया है।

उत्तर

4

यहाँ इस लक्ष्य को हासिल करने के लिए एक गंदा-हैक विधि है (समूह मॉडल को देखने):

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') 
    @property 
    def members(self): 
     return self._members.order_by('membership__date_joined') 

    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) 

एक सेट बनाने के लिए परेशान नहीं किया था संपत्ति सजावट, लेकिन मूल क्षेत्र की सेटिंग की नकल करना काफी आसान होना चाहिए। बदसूरत कामकाज, लेकिन चाल चल रहा है।

+0

यह विधि मेरे लिए अपेक्षा से अधिक रिकॉर्ड लौटाती है। यह एक बाहरी बाएं जॉइन और डेटा डुप्लिकेट बनाने के समाप्त होता है – MrE

0

मुझे लगता है कि यह काम करना चाहिए:

class Membership(models.Model): 
    ... 

    class Meta: 
     ordering = ['date_joined'] 
+0

Unfotunately यह नहीं, ManyRelatedManager लक्ष्य मॉडल :( – pielgrzym

+0

कि गूंगा लगता है के आदेश को कॉपी, लगता है कि यह। मैं एक टिकट खोलने नहीं है की सलाह देते हैं और इस Django-देव गूगल समूह में – SmileyChris

+0

अच्छा विचार को लाने , मैं ऐसा करूँगा और यहां वापस पोस्ट करूंगा जो चर्चा के उभरे हैं :) – pielgrzym