首页 文章

在list_display django中显示子类的信息

提问于
浏览
2

我在 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]

My question is: 我可以在ModelOne的list_display中显示ModelTwo的字段吗? (list_filter和search_fields相同)

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

2 回答

  • 6

    您可以通过使用 @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实例命中数据库 . 因此,如果您're listing 50 instances, you'重新产生50个单独查询的开销(每次调用一个 self.modeltwo_set.all() ) . 那不是 - 它可能是正确的答案,取决于你的情况 . 请注意,这可能是一项非常昂贵的操作 .

  • 0

    您应该使用字段的相关名称或 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 model._meta.get_fields(include_hidden=False) 
            ]
            return self.list_display + extra_fields
    

相关问题