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

pie*_*zym 8 django django-models

我有一个不寻常的问题.让我们考虑一下这些模型(取自django docs):

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)
Run Code Online (Sandbox Code Playgroud)

现在,假设我们在Beatles乐队中有2位甲壳虫乐队成员(遵循django docs中间模型的例子):

>>> beatles.members.all()
[<Person: Ringo Starr>, <Person: Paul McCartney>]
Run Code Online (Sandbox Code Playgroud)

上面的代码将返回按Person模型的默认排序排序的成员.如果我指定:

>>> beatles.members.all().order_by('membership__date_joined') 
Run Code Online (Sandbox Code Playgroud)

成员,通过加入日期排序.我可以以某种方式将此设置为此ManyToMany字段的默认行为吗?那就是在中间模型中按字段设置相关项目的默认顺序?ManyRelatedManager似乎有一个init参数core_filters,但我没有模糊的想法如何在django中使用子类化整个m2m字段来访问它.有创意吗?:)

提前致谢 :)

在django trac开了一张票.

pie*_*zym 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)
Run Code Online (Sandbox Code Playgroud)

没有费心去创建一个设置属性装饰器,但是模仿原始字段的设置应该很容易。丑陋的解决方法,但似乎可以解决问题。