Ответ Линкольна Б. был для меня верным.
Сначала я хотел просто прокомментировать его решение, но на самом деле я решил, что решаю немного другую проблему. У меня был класс администратора, который я хотел «настроить» под свои нужды, а именно - django-taggit
admin. В одном из моих приложений admin.py
я добавил:
# sort tags by name in admin (count items also possible)
from taggit.admin import TagAdmin
TagAdmin.ordering = ["name"]
# make sortable on item_count:
# 1. function for lookup
def item_count(obj):
"""This takes the item_count from object: didn't work as model field."""
return obj.item_count # not needed: obj.taggit_taggeditem_items.count()
# 2. property in function - admin field name
item_count.admin_order_field = 'item_count'
# 3. queryset override, with count annotation
from django.db.models import Count
TagAdmin.queryset = lambda self, request: super(TagAdmin, self).queryset(request).annotate(item_count=Count('taggit_taggeditem_items'))
# 4. add to list display
TagAdmin.list_display = ["name", item_count]
Для меня было интересным наблюдение, что я не мог просто аннотировать queryset
и добавлять "item_count"
к list_display
- потому что в TagAdmin
не было ни метода item_count
, ни метода или поля Tag
модель класса (только в queryset
).