Django中间模型字段的m2m项默认排序 [英] Default ordering for m2m items by intermediate model field in Django
问题描述
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会员(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
date_joined = models.DateField()
invite_reason = models.CharField(max_length = 64)
现在,我们说在甲壳虫乐队中有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字段进行子类化。任何创意? :)
提前感谢:)
我已经打开了一个 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
类成员(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
date_joined = model s.DateField()
invite_reason = models.CharField(max_length = 64)
打扰创建一个集合属性的装饰器,但应该很容易模仿原始场的设置。丑陋的解决方法,但似乎做的伎俩。
I have an unusual problem. Let's consider such models (taken from 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)
Now, let's say we've got 2 Beatles members in out Beatles band (following the example in django docs for intermediate models):
>>> beatles.members.all()
[<Person: Ringo Starr>, <Person: Paul McCartney>]
The above code will return members sorted by default ordering for Person model. If I specify:
>>> beatles.members.all().order_by('membership__date_joined')
the members, are sorted via the date joined. Can I somehow set this as default behavior for this ManyToMany field? That is to set default order of related items by field in the intermediate model? The ManyRelatedManager seems to have an init argument core_filters, but I have no vague idea how to access it withous subclassing the whole m2m field in django. Any creative ideas? :)
Thanks in advance :)
I've opened a ticket in django trac.
Here is a dirty-hack method to achieve this (look at Group model):
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)
Didn't bother to create a set property decorator, but it should be quite easy to mimic the setting of original field. Ugly workaround, but seems to do the trick.
这篇关于Django中间模型字段的m2m项默认排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!