在列表中显示子类的信息

我在models.py中有两个类:

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也是如此)

我需要这个,因为我有许多与主类相关的子类!


通过使用@property装饰器编写一个实例方法,你可以在list_display显示任何你想要的东西,然后它返回你需要的任何东西,并将它包含在list_display 。 但我认为这list_filter用于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() )。 这并不一定意味着你不应该这样做 - 这可能是正确的答案,取决于你的情况。 请注意,这可能是一项相当昂贵的操作。

链接地址: http://www.djcxy.com/p/38673.html

上一篇: Show information of subclass in list

下一篇: django