In order to avoid time consuming and costly exact database count queries, I'd like to override the
count() method inside a Django admin class like so:
from django.contrib import admin from django.db import connection class CountProxy: def __call__(self): # how to access the queryset `query` here? query = ... try: if not query.where: cursor = connection.cursor() cursor.execute("SELECT reltuples FROM pg_class WHERE relname = %s", [query.model._meta.db_table]) n = int(cursor.fetchone()) if n >= 1000: return n # exact count for small tables return object_list.count() except: # exception for lists return len(object_list) return estimated_count class MyAdmin(admin.ModelAdmin): def get_queryset(self, request): qs = super(MyAdmin, self).get_queryset(request) qs.count = CountProxy() return qs
But I don#t know how to access the original queryset within my
CountProxy class. Any idea? I know I can overwrite the whole
changelist view through
get_changelist. But that involves a lot of duplicating code from Django's repo.