按字母顺序按多对多关系排序值,然后list_display第一个项目

时间:2013-10-01 09:42:19

标签: python django django-models django-admin

我的模型如下:

class talk(models.Model):
    ...
    speakers = models.ManyToManyField('speaker')
    ...

与模型speaker

有关
class speaker(models.Model):
    name = models.CharField(max_length=255)
    email = models.CharField(max_length=255)
    ...

我想按字母顺序对课程talk中的发言人进行排序,以便speakers['charlie', 'bill', 'andy']成为speakers['andy', 'bill', 'charlie']

一旦我完成了这项工作,我就会有一个类talkAdmin,如下所示:

class talkAdmin(admin.ModelAdmin):

    readonly_fields = ('slug',)
    list_display = ['title', 'speakers', 'date']
    search_fields = ['title', 'speakers']

目前这不起作用,因为list_display不接受ManyToManyField。我想做的是将每个对象放入扬声器并将其显示在自己的列中。

-------------------------------------------------
|Talk   |Speaker   |Second Speaker|Third Speaker|
|Django |Andy      |Bill          |Charlie      |
-------------------------------------------------

这可能吗?

2 个答案:

答案 0 :(得分:1)

好吧,你可以在ModelAdmin上定义一系列自定义方法,每个方法返回位置X的扬声器。但从数据库的角度来看,这将是非常低效的(每列都会需要单独的查找)并且不是非常可扩展的。

您是否可以将扬声器作为逗号分隔的名单列表?通过自定义方法,这很容易:

class TalkAdmin(admin.ModelAdmin):

    list_display = ['title', 'get_speakers', 'date']

    def get_speakers(self, obj):
        speakers = obj.speakers.all().order_by('name').values_list('name', flat=True)
        return ', '.join(speakers)

答案 1 :(得分:0)

对于第一点,您可以在获取演讲的发言者时指定顺序,即:

speakers = talk.speakers.order_by("name")

或将“name”设置为Speaker模型的默认排序,如果这是您的常见用例,即:

class Speaker(models.Model):
    # your code here
    class Meta:
        ordering = ("name",)

对于第二点,因为每个讲话可以从零到几十亿的发言者,你不能真正期望每个发言者有一个专栏......你能做的是为你的ModelAdmin课程添加一些方法每个Talk的逗号分隔(或其他)发言人列表,因此您仍然只有一个字段。如何做到这一点在此完整记录:https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display