在 list_display django 中显示子类的信息



有两个类 models.py

类模型一(模型。型号):   field_one = 模型。查菲尔德(max_length=100)   field_two = 模型。查菲尔德(max_length=200)   field_three = 模型。查菲尔德(max_length=300)   [...] #other 领域   定义__unicode__(个体经营):       返回self.field_one类模型二(模型。型号):   relation_model_one = 模型。外键(模型一)   other_field = 模型。查菲尔德(max_length=50)   [...]   定义__unicode__(个体经营):       返回 self.relation_model_one.field_one

你 admin.py 的政府是这样的:

类模型二内联(管理员。堆叠内联):    模型 = 模型二    额外 = 0类模型一管理员(管理员.模型管理员):    list_display = ('field_one', 'field_two', 'field_three',)    内联 = [模型二内联]

我的问题是:我可以list_display模型一显示模型二的字段吗?(list_filter和search_fields相同)

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

您可以通过

使用 @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() 一个查询)。这并不一定意味着你不应该这样做 - 这可能是正确的答案,这取决于你的情况。请注意,这可能是一项非常昂贵的操作。

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

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 ModelTwo._meta.get_fields(include_hidden=False) 
        ]
        return self.list_display + extra_fields
        

最新更新