| 123456789101112131415161718192021222324252627282930 |
- __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
|