Как кэшировать разбитый на страницы набор запросов Django

Как вы кешируете постраничный набор запросов Django, особенно в ListView?

Я заметил, что выполнение одного запроса занимало много времени, поэтому яЯ пытаюсь его кешировать. Набор запросов огромен (более 100 тыс. Записей), поэтому яЯ пытаюсь только кэшировать его подразделы. Я могу'• кэшировать весь вид или шаблон, потому что есть разделы, которые зависят от пользователя / сеанса и должны постоянно меняться.

ListView имеет несколько стандартных методов для получения набора запросов,get_queryset(), который возвращает не разбитые на страницы данные, иpaginate_queryset(), который фильтрует его по текущей странице.

Сначала я попытался кэшировать запрос вget_queryset(), но быстро поняла, зоветcache.set(my_query_key, super(MyView, self).get_queryset()) вызывал сериализацию всего запроса.

Итак, я попытался переопределитьpaginate_queryset() лайк:

import time
from functools import partial
from django.core.cache import cache
from django.views.generic import ListView

class MyView(ListView):

    ...

    def paginate_queryset(self, queryset, page_size):
        cache_key = 'myview-queryset-%s-%s' % (self.page, page_size)
        print 'paginate_queryset.cache_key:',cache_key
        t0 = time.time()
        ret = cache.get(cache_key)
        if ret is None:
            print 're-caching'
            ret = super(MyView, self).paginate_queryset(queryset, page_size)
            cache.set(cache_key, ret, 60*60)
        td = time.time() - t0
        print 'paginate_queryset.time.seconds:',td
        (paginator, page, object_list, other_pages) = ret
        print 'total objects:',len(object_list)
        return ret

Тем не менее, это займет почти минуту, хотя извлекается только 10 объектов, и каждый запрос показывает "повторное кэширование», подразумевая, что ничего не сохраняется в кеш.

мойsettings.CACHE похоже:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

а такжеservice memcached status показывает, что memcached запущен иtail -f /var/log/memcached.log абсолютно ничего не показывает.

Что я делаю неправильно? Как правильно кэшировать разбитый на страницы запрос, чтобы весь набор запросов нет восстановлен?

Редактировать: Я думаю, что они могут быть ошибкой в memcached или в оболочке Python. Похоже, что Django поддерживает два разных бэкэнда memcached, один из которых использует python-memcached, а другой - pylibmc. Кажется, что python-memcached молча скрывает ошибку, кеширующуюpaginate_queryset() значение. Когда я переключился на бэкэнд pylibmc, теперь я получаю явное сообщение об ошибке "ошибка 10 из memcached_set: SERVER ERROR " прослеживание до набора django / core / cache / backends / memcached.py в строке 78.

Ответы на вопрос(2)

Ваш ответ на вопрос