在列表中显示子类的信息
我在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_display
。 但我认为这list_filter
用于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()
)。 这并不一定意味着你不应该这样做 - 这可能是正确的答案,取决于你的情况。 请注意,这可能是一项相当昂贵的操作。
上一篇: Show information of subclass in list
下一篇: django