0

我有一个模型如下:

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

这可能吗?

4

2 回答 2

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)
于 2013-10-01T09:57:16.337 回答
0

对于第一点,您可以在让演讲者进行演讲时指定顺序,即:

speakers = talk.speakers.order_by("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

于 2013-10-01T09:59:16.853 回答