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)
没有刻意去打造一个集属性装饰器,但应该很容易模仿原始场的设置。丑陋的解决方法,但似乎在伎俩。
我认为这应该工作:
class Membership(models.Model):
...
class Meta:
ordering = ['date_joined']
不幸的是,它没有,ManyRelatedManager似乎复制目标模型的排序:( – pielgrzym 2009-09-07 23:27:15
这似乎是愚蠢的,不是吗我建议打开一张票,并在django-dev谷歌组中提出这个问题 – SmileyChris 2009-09-08 04:43:31
好主意,我会做到这一点,并回到这里讨论什么:) – pielgrzym 2009-09-08 08:32:03
此方法返回比我预期更多的记录。它最终会创建一个OUTER LEFT JOIN并复制数据 – MrE 2017-05-17 19:23:27