Issue
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()[0])
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.
Solution
I could be wrong, but could you pass qs
as an instance attribute for CountProxy
?
class CountProxy:
def __init__(self, query):
self.query = query
def __call__(self):
# you've already had the query here, do something with self.query
class MyAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super(MyAdmin, self).get_queryset(request)
qs.count = CountProxy(qs)
return qs
Answered By - Shang Wang Answer Checked By - David Goodson (PHPFixing Volunteer)
0 Comments:
Post a Comment
Note: Only a member of this blog may post a comment.