Можем ли мы кэшировать подсчет запросов до того, как запрос попадет в 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 для каждого запроса, так что не так уж много кэшируется.

Таким образом, вы можете реализовать свое собственное решение кэширования поверх этой функции.

Вернуться на верх