-
-
Save karthicraghupathi/9c98fa84d66bc88af3f022f4c10fb118 to your computer and use it in GitHub Desktop.
CountTimeoutLimitPaginator - Paginator that enforced a timeout on the count operation.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class TimeLimitedPaginator(Paginator): | |
""" | |
Paginator that enforced a timeout on the count operation. | |
When the timeout is reached a "fake" large value is returned instead, | |
Why does this hack exist? On every admin list view, Django issues a | |
COUNT on the full queryset. There is no simple workaround. On big tables, | |
this COUNT is extremely slow and makes things unbearable. This solution | |
is what we came up with. | |
""" | |
@cached_property | |
def count(self): | |
# We set the timeout in a db transaction to prevent it from | |
# affecting other transactions. | |
with transaction.atomic(), connection.cursor() as cursor: | |
cursor.execute('SET LOCAL statement_timeout TO 200;') | |
try: | |
return super().count | |
except OperationalError: | |
return 9999999999 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment