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?
Django Admin's "change list" is the page that lists all objects of a given model. Now, all your articles should have a different name, and more explicit than "Article object".
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.
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'
Try this:
make a new Manager (and aggregate with count on the book relation field):
class PublisherManager(models.Manager): def get_query_set(self): return super(PublisherManager,self).get_query_set().annotate(pubcount=Count('book'))
sort it on pubcount
:
class Publisher(models.Model): ...... objects = PublisherManager() class Meta: ordering = ('pubcount',)
You should indeed start off with adding:
class PublisherManager(models.Manager):
def get_query_set(self):
return super(PublisherManager,self).get_query_set().annotate(pubcount=Count('book'))
But the correct way to add it as a sortable field is:
class Publisher(models.Model):
......
objects = PublisherManager()
def count(self):
return self.pubcount
count.admin_order_field = 'pubcount'
And then you can just add 'count' to the list_display attribute of model admin in admin.py
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With