【问题标题】:How to display the foreign key and many-to-many fields in Django admin `list_display`?如何在 Django admin `list_display` 中显示外键和多对多字段?
【发布时间】:2021-04-11 09:47:36
【问题描述】:

如何在Django admin list_display中显示外键和多对多字段?

models.py:

class Book(models.Model):
    title = models.CharField(max_length=150, blank=False)

class Character(models.Model):
    book = models.ForeignKey(Book, on_delete=models.CASCADE, related_name='character')
    name = models.CharField(max_length=50)

class Author(models.Model):
    book = models.ManyToManyField(Book, related_name='author')
    name = models.CharField(max_length=50)

admin.py:

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'characters', 'authors')

    def characters(self, obj):
        ???

    def authors(self, obj):
        ???

【问题讨论】:

  • 如何显示?作为逗号分隔的列表还是什么?

标签: django django-admin


【解决方案1】:

您可以获取相关的characters/authors,然后将名称加入逗号分隔的列表中:

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'characters', 'authors')

    def characters(self, obj):
        return ', '.join([c.name for c in obj.character.all()])

    def authors(self, obj):
        return ', '.join([a.name for a in obj.author.all()])

我们可以通过使用.prefetch_related(…) [Django-doc] 批量获取所有相关对象来提高性能:

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'characters', 'authors')

    def characters(self, obj):
        return ', '.join([c.name for c in obj.character.all()])

    def authors(self, obj):
        return ', '.join([a.name for a in obj.author.all()])

    def get_queryset(self, request):
        return super().get_queryset(request).prefetch_related(
            'character', 'author'
        )

由于related_name 是反向关系,并且可以有多个 Characters/Authors,因此给它们一个复数 名字。

【讨论】:

    猜你喜欢
    • 2021-06-01
    • 2016-12-14
    • 2021-04-11
    • 2012-01-08
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 2016-02-23
    • 2012-06-23
    相关资源
    最近更新 更多