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