31 lines
1.2 KiB
Python
31 lines
1.2 KiB
Python
__package__ = 'archivebox.misc'
|
|
|
|
from django.core.paginator import Paginator
|
|
from django.utils.functional import cached_property
|
|
|
|
|
|
class AccelleratedPaginator(Paginator):
|
|
"""
|
|
Accellerated Pagniator ignores DISTINCT when counting total number of rows.
|
|
Speeds up SELECT Count(*) on Admin views by >20x.
|
|
https://hakibenita.com/optimizing-the-django-admin-paginator
|
|
"""
|
|
|
|
@cached_property
|
|
def count(self):
|
|
if self.object_list._has_filters(): # type: ignore
|
|
# fallback to normal count method on filtered queryset
|
|
return super().count
|
|
else:
|
|
# otherwise count total rows in a separate fast query
|
|
return self.object_list.model.objects.count()
|
|
|
|
# Alternative approach for PostgreSQL: fallback count takes > 200ms
|
|
# from django.db import connection, transaction, OperationalError
|
|
# with transaction.atomic(), connection.cursor() as cursor:
|
|
# cursor.execute('SET LOCAL statement_timeout TO 200;')
|
|
# try:
|
|
# return super().count
|
|
# except OperationalError:
|
|
# return 9999999999999
|