Resultados de búsqueda en caché en django

Estoy tratando de encontrar una forma de almacenar en caché los resultados de una consulta que no cambiará con la frecuencia. Por ejemplo, categorías de productos de un comercio electrónico (teléfonos celulares, TV, etc.). Estoy pensando en utilizar el almacenamiento en caché de fragmentos de la plantilla, pero en este fragmento, voy a iterar sobre una lista de estas categorías. Esta lista está disponible en cualquier parte del sitio, por lo que está en mi archivo base.html . ¿Siempre tengo que enviar la lista de categorías cuando renderizo las plantillas? ¿O hay una forma más dinámica de hacerlo, haciendo que la lista siempre esté disponible en la plantilla?

Pop su consulta en caché en la memoria caché de Django :

 from django.core.cache import cache cache.set('key', queryset) 

A continuación, cree un procesador de contexto para agregar el valor de la memoria caché a todas las plantillas:

 # myproject/myapp/context_processors.py from django.core.cache import cache def cached_queries(): return {'cache', cache.get('key')} 

A continuación, agregue su procesador de contexto en su archivo de configuración de Django :

 TEMPLATE_CONTEXT_PROCESSORS += ( 'myproject.myapp.context_processors.cached_queries' ) 

Ahora podrá acceder a la variable de cache en todas las plantillas genéricas y todas las plantillas que tengan un contexto de solicitudes, que se proporciona una plantilla si esto se hace en la vista:

 return render_to_response('my_template.html', my_data_dictionary, context_instance=RequestContext(request)) 

Cuándo configurar la memoria caché

Depende de lo que está contenido en el caché. Sin embargo, un problema común es que Django solo consigue ejecutar Python cada vez que se envía una solicitud de página, y esto no suele ser el lugar donde desea hacer este tipo de trabajo.

Una alternativa es crear un comando de administración personalizado para una aplicación en particular. Puede ejecutar esto manualmente cuando sea necesario o, más comúnmente, configurarlo para que se ejecute como un trabajo cron .

Para crear un comando de administración, debe crear una clase descentrada desde Command dentro de un directorio de management/commands ubicado dentro de una aplicación:

 # myproject/myapp/management/commands/update_cache.py from django.core.management.base import NoArgsCommand from django.core.cache import cache class Command(NoArgsCommand): help = 'Refreshes my cache' def handle_noargs(self, **options): cache.set('key', queryset) 

El nombre de este archivo es importante ya que este será el nombre del comando. En este caso, ahora puede llamar esto en la línea de comando:

 python manage.py update_cache 

También puede usar johnny-cache para el almacenamiento en caché automático de querysets. Va a caché (de forma predeterminada) todos los conjuntos de consulta, pero puede forzarlo a no almacenar en caché alguno.