2009-09-07 68 views
8

我有一個不尋常的問題。讓我們考慮這樣的模型(從Django文檔拍攝):Django中間模型字段的m2m項目默認排序

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>] 

以上代碼將返回按排序的會員,默認排序爲Person模型。如果我指定:

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

的成員,通過組織成員加入日期排序。我可以以某種方式將此設置爲此ManyToMany字段的默認行爲?那就是在中間模型中按字段設置相關項目的默認順序? ManyRelatedManager似乎有一個初始化參數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

此方法返回比我預期更多的記錄。它最終會創建一個OUTER LEFT JOIN並複製數據 – MrE 2017-05-17 19:23:27

0

我認爲這應該工作:

class Membership(models.Model): 
    ... 

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

不幸的是,它沒有,ManyRelatedManager似乎複製目標模型的排序:( – pielgrzym 2009-09-07 23:27:15

+0

這似乎是愚蠢的,不是嗎我建議打開一張票,並在django-dev谷歌組中提出這個問題 – SmileyChris 2009-09-08 04:43:31

+0

好主意,我會做到這一點,並回到這裏討論什麼:) – pielgrzym 2009-09-08 08:32:03