django - 在list_display django中显示子类的信息

标签 django django-models django-admin

我在 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_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() 一个查询)。这并不一定意味着您不应该这样做——这可能是正确的答案,具体取决于您的情况。请注意,这可能是一项相当昂贵的操作。

关于django - 在list_display django中显示子类的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6022456/

相关文章:

django:manytomanyfield with through 如何出现在管理员中?

python - 我如何获得 blog_post.title 以及构建自定义 SQL 查询的最新评论?

python - 多对多关系 禁止直接分配到多对多集合的前向端

python - Django GenericIPAddress 字段不验证输入

django - 在多对一关系中强制父级的字段唯一性

django - 管理员中的 list_filter

python - 属性错误 : 'module' object has no attribute 'commit_on_success'

python - 我收到错误消息,因为o​​jit_prehh对象没有属性 'QuerySet',这是什么意思,以及如何解决?

python - Django更改表单字段错误消息

python - 在 django admin 中按天分组?