Django Admin:list_display()按相关对象计数

时间:2019-04-30 08:06:57

标签: django django-admin

假设您有一个模型Person,其中可以有N个Book实例。

我想在django管理员更改列表视图中显示一个人拥有的书籍数量。

显示数字很容易(在PersonAdmin上编写自定义方法)。

但是我找不到一种方法来使它可以根据一个人拥有的书籍数量进行排序。

我阅读了list_display的文档,但找不到答案。

根据文档,可以使用查询表达式。这样可以解决吗?

应用答案后,看起来就是这样。在这种情况下,每个实例都有N个日志条目:

order-by-log-count

1 个答案:

答案 0 :(得分:6)

借助 get_queryset() annoate() 覆盖模型管理员的 order_by() 方法方法。然后,定义一个可调用的函数( book_count())以将值返回到更改列表页面

from django.db.models.aggregates import Count

class PersonAdmin(admin.ModelAdmin):
    list_display = ('book_count', 'other_field')

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        qs = qs.annotate(book_count=Count('book')).order_by('-book_count')
        return qs

    def book_count(self, person_instance):
        return person_instance.book_count

为什么我没有添加 ordering

虽然我们调用 super() ,但Django会抛出异常