在列表中显示子类的信息
我在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
