2011-05-16 155 views
1

我在models.py兩類子類的信息:顯示在list_display Django的

class ModelOne(models.Model): 
    field_one = models.CharField(max_length=100) 
    field_two = models.CharField(max_length=200) 
    field_three = models.CharField(max_length=300) 
    [...] #other fields 
    def __unicode__(self): 
     return self.field_one 

class ModelTwo(models.Model): 
    relation_model_one = models.ForeignKey(ModelOne) 
    other_field = models.CharField(max_length=50) 
    [...] 
    def __unicode__(self): 
     return self.relation_model_one.field_one 

而且在admin.py你的管理是這樣的:

 
class ModelTwoInline(admin.StackedInline): 
    model = ModelTwo 
    extra = 0 

class ModelOneAdmin(admin.ModelAdmin): 
    list_display = ('field_one', 'field_two', 'field_three',) 
    inlines = [ModelTwoInline] 

我的問題是: 我可以在ModelOne的list_display中顯示ModelTwo的字段嗎? (同爲list_filter和search_fields)

我需要這個,因爲我有相關的主類的子類很多!

回答

5

通過使用@property裝飾器編寫實例方法,您可以在list_display中顯示任何您想要的東西,裝飾器然後返回您需要的任何東西,並將其包含在list_display中。但我不認爲這適用於list_filter

所以,讓我們回到你的ModelOne類:

class ModelOne(models.Model): 
    [...] 

    def __unicode__(self): 
     return self.field_one 

    @property 
    def model_two_other_field(self): 
     return ', '.join([m2.other_field for m2 in self.modeltwo_set.all()]) 

然後,在你ModelOneAdmin:

class ModelOneAdmin(admin.ModelAdmin): 
    list_display = ('field_one', 'field_two', 'field_three', 'model_two_other_field') 
    [...] 

我想指出,備案,當你這樣做,你會要求每 ModelOne實例正在顯示的數據庫命中爲。因此,如果列出50個實例,則會產生50個獨立查詢的開銷(每個調用self.modeltwo_set.all()一個)。這並不一定意味着你不應該這樣做 - 這可能是正確的答案,取決於你的情況。請注意,這可能是一項相當昂貴的操作。