django在列表中显示子类信息

Show information of subclass in list_display django

我在models.py中有两个类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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中的管理是:

1
2
3
4
5
6
7
class ModelTwoInline(admin.StackedInline):
    model = ModelTwo
    extra = 0

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

我的问题是:我可以在ModelOne的列表显示中显示Model2的字段吗?(列表筛选和搜索字段相同)

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


通过使用@property修饰器编写实例方法,可以在list_display中显示所需的任何内容,该方法随后返回所需的任何内容,并将其包含在list_display中。不过,我认为这对list_filter不起作用。

那么,让我们回到你的ModelOne课程:

1
2
3
4
5
6
7
8
9
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中:

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

我要注意的是,对于记录,当您这样做时,您将需要对显示的每个ModelOne实例进行数据库命中。因此,如果您要列出50个实例,则会产生50个独立查询的开销(每调用一次self.modeltwo_set.all())。这并不一定意味着你不应该这样做——这可能是正确的答案,取决于你的情况。请注意,这可能是一个相当昂贵的操作。


您应该使用字段的相关名称或RelatedModel._meta.get_fields

1
2
3
4
5
6
7
8
9
10
class ModelOneAdmin(admin.ModelAdmin):
    list_display = ('field_one', 'field_two', 'field_three')
    inlines = [ModelTwoInline]

    def get_list_display(self, request):
        extra_fields = [
            f.name for model in self.inlines
            for f in model._meta.get_fields(include_hidden=False)
        ]
        return self.list_display + extra_fields