Можем ли мы кэшировать подсчет запросов до того, как запрос попадет в django
У меня есть домашняя страница, которая содержит списки из очень большой таблицы. Она пагинация PageNumberPagination. На время загрузки этой страницы влияет запрос count(*)
пагинатора. Я решил проблему медлительности для всех остальных запросов, установив django-cachalot. Однако первый запрос по-прежнему занимает много времени. Я попытался создать поддельный запрос в AppConfig.ready()
, чтобы запрос count(*)
кэшировался каждый раз при загрузке проекта. Но это не сработало.
Существует ли чистый хак для кэширования запроса count(*)
до того, как будет сделан первый запрос?
Чистый взлом? Не совсем! :)
Однако, вы можете поиграть с собственным классом, наследующим от PageNumberPagination
. Затем попробуйте реализовать функцию de count
на родительском классе Paginator
:
@cached_property
def count(self):
"""Return the total number of objects, across all pages."""
c = getattr(self.object_list, "count", None)
if callable(c) and not inspect.isbuiltin(c) and method_has_no_args(c):
return c()
return len(self.object_list)
Хотя эта функция говорит @cached_property
, она будет создавать новый экземпляр класса Paginator
для каждого запроса, так что не так уж много кэшируется.
Таким образом, вы можете реализовать свое собственное решение кэширования поверх этой функции.