Django Admin:list_display() 按相关对象的数量排序

gue*_*tli 0 django django-admin

想象一下,你有一个Person可以有 N 个Book实例的模型。

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

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

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

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

根据文档,可以使用查询表达式。有没有可能以这种方式解决它?

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

按日志计数排序

JPG*_*JPG 7

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

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
Run Code Online (Sandbox Code Playgroud)

为什么我没有添加ordering

当我们调用 时super(),Django 会抛出异常

  • 为了使它真正可排序,您不应该还添加: book_count.admin_order_field = 'book_count' (2认同)