一尘不染

如何在具有多对一关系的模型的Django管理员中添加可排序的计数列?

django

假设我有一个Book模型,其中包含指向Publisher模型的外键。

如何以一种可以使用内置排序的方式在Django admin中显示一列包含每个出版商出版的书籍数量的列?


阅读 446

收藏
2020-04-02

共1个答案

一尘不染

我遇到了同样的问题(我无法更改模型的经理来添加慢速注释或联接)。此处两个答案的组合有效。@Andre非常接近,Django Admin支持仅修改admin的查询集,因此在此处应用相同的逻辑,然后使用admin_order_field属性。当然,你仍然需要将新的管理字段添加到list_display。

from django.db.models import Count

class EventAdmin(admin.ModelAdmin)
    list_display = (..., 'show_artist_count')

    def queryset(self, request):
    # def get_queryset(self, request):    for Django 1.6+
        qs = super(EventAdmin, self).queryset(request)
        return qs.annotate(artist_count=Count('artists'))

    def show_artist_count(self, inst):
        return inst.artist_count
    show_artist_count.admin_order_field = 'artist_count'
2020-04-02