我的模型如下:
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 |
-------------------------------------------------
这可能吗?
答案 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