#python #django
Не получается закешировать данные.
Делаю так (ctype.id=158, objects=[данные в QuerySet формате]):
from django.core.cache import cache
cached_objects = cache.get('top_rating_%s'%ctype.id) #вынимаем из кеша
if cached_objects is None: #Если кеш пуст, то...
#Тут манипуляция данными
cache.set('top_rating_%s'%ctype.id, objects, time=1800) #Кладем в кеш значение objects
return objects #Возвращаем objects
else:
return cached_objects #Возвращаем значение из кеша
Пробовал перевести данные из типа QuerySet в list:
...
objects = list(objects) #Преобразую
cache.set('top_rating_%s'%ctype.id, objects, time=1800) #Кладу в кеш
...
В обоих случаях в кеш ничего не сохранялось.
Для проверки пробовал просто положить в кеш строку, все отлично сработало, в кеше
значение прожило ровно столько, сколько указал во времени жизни.
Ответы
Ответ 1
Кеш он глупый, умеет хранить только базовые типы данных. Поэтому сложные структуры которые зависят от классов или типов указанных в приложении нужно сериализовать перед записью в кеш и десериализовать после. Сериализация объектов в Django Также можно воспользоваться модулем pickleОтвет 2
Видимо, все зависит от бэкенда, т.к. за сериализацию данных каждый бэкенд отвечает сам. К примеру, с memcache, приведенный выше код, должен работать, т.к. memcache не скалярные данные сериализует при помощи pickle. UPD. Проверил на django 1.3, python 2.7 - все бэкенды используемые в django автоматически сериализируют объекты, т.ч., видимо, у вас где-то ошибка.
Комментариев нет:
Отправить комментарий