Django中间模型字段的m2m项默认排序 [英] Default ordering for m2m items by intermediate model field in Django

查看:134
本文介绍了Django中间模型字段的m2m项默认排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆