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

时间:2009-09-07 18:44:49

标签: 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)

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

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

2 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分:0)

我认为这应该有效:

class Membership(models.Model):
    ...

    class Meta:
        ordering = ['date_joined']