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的字段吗?(列表筛选和搜索字段相同)
我需要这个,因为我有许多与主类相关的子类!
通过使用
那么,让我们回到你的
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个独立查询的开销(每调用一次
您应该使用字段的相关名称或
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 |