2013-10-01 20 views
0

我有一個模型,如下所示:在許多對許多關係字母順序值,然後list_display第一項

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

這可能嗎?

回答

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) 
+0

啊!這比我想象的還要高效得多。謝謝。 – Nanor

0

對於第一點,你可以讓音箱時的談話,specifiy排序即:

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

+0

我並不希望爲每個揚聲器動態添加一列,而是有三個主揚聲器,但我很欣賞你的觀點。 – Nanor