如何将一个可sorting的计数列添加到具有多对一关系的模型的Djangopipe理员?
假设我有一个Book模型包含一个发布模型的外键。
我怎样才能在Django的pipe理员显示一个由每个发布者发布的书的数量列,我可以使用内置的sorting?
我有同样的问题(我不能改变我的模型的经理添加慢注释或连接)。 两个答案的组合在这里工作。 @Andre非常接近,Django Admin支持只修改admin的查询集,所以在这里应用相同的逻辑,然后使用admin_order_field属性。 当然,您仍然需要将新的admin字段添加到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'
尝试这个:
做一个新的经理 (并与书籍关系领域汇总 ):
class PublisherManager(models.Manager): def get_query_set(self): return super(PublisherManager,self).get_query_set().annotate(pubcount=Count('book'))
按照pubcount
sorting:
class Publisher(models.Model): ...... objects = PublisherManager() class Meta: ordering = ('pubcount',)
你应该开始添加:
class PublisherManager(models.Manager): def get_query_set(self): return super(PublisherManager,self).get_query_set().annotate(pubcount=Count('book'))
但是将其作为可sorting字段添加的正确方法是:
class Publisher(models.Model): ...... objects = PublisherManager() def count(self): return self.pubcount count.admin_order_field = 'pubcount'
然后,您可以在admin.py中将“count”添加到model admin的list_display属性中
尝试这样的事情:
class PublisherAdminWithCount(Admin): def book_count(self, obj): return obj.book_set.count() list_display = ('user_count',) admin.site.register(Group, PublisherAdminWithCount)
林肯B的回答对我来说是正确的。
起初我只想评论一下他的解决scheme,但是我发现自己解决了一个稍微不同的问题。 我有一个pipe理类,我想“定制”我的需求 – 即django-taggit
pipe理员。 在我的一个应用程序的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]
对我来说有趣的是,我不能只注释查询集,并将"item_count"
添加到list_display
– 因为item_count
中没有item_count
方法,也没有Tag
模型类中的方法或字段(仅在queryset
)。