Показать информацию о подклассе в list_display django - PullRequest
2 голосов
/ 16 мая 2011

У меня есть два класса в 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]

Мой вопрос: Могу ли я отобразить поля ModelTwo в list_display ModelOne? (То же самое для list_filter и search_fields)

Мне это нужно, потому что у меня много подклассов, связанных с основным классом!

Ответы [ 2 ]

6 голосов
/ 17 мая 2011

Вы можете отобразить что угодно в list_display, написав метод экземпляра с помощью декоратора @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()).Это не обязательно означает, что вы не должны этого делать - это может быть правильный ответ, в зависимости от вашей ситуации.Просто знайте, что это может быть довольно дорогой операцией.

0 голосов
/ 04 сентября 2018

Вы должны использовать связанное имя поля или RelatedModel._meta.get_fields

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
...