Страницы

Поиск по вопросам

среда, 15 апреля 2020 г.

Кеширование в Django

#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 автоматически сериализируют объекты, т.ч., видимо, у вас где-то ошибка.

Комментариев нет:

Отправить комментарий