Django中间模型字段的m2m项目默认排序

问题描述:

我有一个不寻常的问题。让我们考虑这样的模型(从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

这里是一个脏黑客的方法来实现这个(看组模型):

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

我认为这应该工作:

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