首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在list_display django中显示子类的信息?

在list_display django中显示子类的信息?
EN

Stack Overflow用户
提问于 2018-09-04 04:30:11
回答 2查看 0关注 0票数 0

我在models.py中有两个类:

代码语言:javascript
复制
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字段
   def __unicode __(self):
       返回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的管理是这样的:

代码语言:javascript
复制
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相同)

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

EN

回答 2

Stack Overflow用户

发布于 2018-09-04 13:16:51

您可以list_display通过使用@property装饰器编写实例方法来显示您想要的任何内容,然后返回您需要的任何内容,并将其包含在内list_display。我认为这不起作用list_filter

那么,让我们回到你的ModelOne班级:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
class ModelOneAdmin(admin.ModelAdmin):
    list_display = ('field_one', 'field_two', 'field_three', 'model_two_other_field')
    [...]

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

票数 0
EN

Stack Overflow用户

发布于 2018-09-04 14:25:21

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

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100008843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档