如何向具有多对一关系的模型的 Django 管理添加可排序计数列?
假设我有一个 Book 模型,其中包含 Publisher 模型的外键。
如何以可以使用内置排序的方式在 Django 管理中显示包含每个出版商出版的书籍数量的列?
Suppose I have a Book model containing a foreign key to a Publisher model.
How can I display in the Django admin a column with the number of books published by each publisher, in a way that I can use the built-in sorting?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我遇到了同样的问题(我无法更改模型的管理器来添加缓慢的注释或连接)。这里的两个答案的组合是有效的。 @Andre 非常接近,Django 管理员支持修改管理员的查询集,因此在这里应用相同的逻辑,然后使用 admin_order_field 属性。当然,您仍然需要将新的管理字段添加到 list_display 中。
姜戈1.6:
姜戈 > 1.6:
I had the same issue (I cannot change my model's manager to add slow annotations or joins). A combination of two of the answers here works. @Andre is really close, the Django Admin supports modifying the queryset for just the admin, so apply the same logic here and then user the admin_order_field attribute. You still need to add the new admin field to list_display, of course.
Django < 1.6:
Django > 1.6:
试试这个:
创建一个新的 Manager (和 聚合,其中包含图书关系字段的计数):
在
pubcount:
Try this:
make a new Manager (and aggregate with count on the book relation field):
sort it on
pubcount
:您确实应该从添加开始:
但是将其添加为可排序字段的正确方法是:
然后您可以将“count”添加到 admin.py 中模型管理的 list_display 属性中
You should indeed start off with adding:
But the correct way to add it as a sortable field is:
And then you can just add 'count' to the list_display attribute of model admin in admin.py
Lincoln B 的回答对我来说是正确的方法。
起初我只想评论他的解决方案,但实际上我发现自己解决了一个略有不同的问题。我有一个管理类,我想根据我的需要“定制”它 - 即 django-taggit 管理类。在我的一个应用程序的
admin.py
中,我添加了:对我来说有趣的观察是,我不能只注释
queryset
,并添加“item_count”
到list_display
- 因为TagAdmin
中没有item_count
方法,Tag
中也没有方法或字段code> 模型类(仅在queryset
中)。Lincoln B's answer was the right way for me.
At first I wanted to just comment on his solution, but I actually found myself solving a slightly different problem. I had an admin class, which I wanted to "customize" to my needs - namely the
django-taggit
admin. In one of my application'sadmin.py
, I added:The interesting observation for me was, that I could not just annotate the
queryset
, and add"item_count"
tolist_display
- because there was noitem_count
method inTagAdmin
, nor a method or field in theTag
model class (only in thequeryset
).尝试这样的事情:
Try something like this: