在django中caching查询结果

我试图find一种方法来caching查询的结果不会随频率而改变。 例如,来自电子商务(手机,电视等)的产品类别。 我正在考虑使用模板片段caching,但在这个片段中,我将遍历这些类别的列表。 这个列表在网站的任何部分都是可用的,所以它在我的base.html文件中。 渲染模板时,我是否总是发送类别列表? 还是有一个更dynamic的方式来做到这一点,使列表总是可用的模板?

把你的caching查询放到Django的caching中 :

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

然后创build一个上下文处理器,将caching的值添加到所有模板中:

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

然后在你的Django设置文件中添加你的上下文处理器:

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

现在,您将能够访问所有通用模板中的cachevariables以及具有请求上下文的所有模板,如果在视图中完成了该模板,则会提供该模板:

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

何时设置caching

这取决于caching中包含的内容。 然而,一个常见的问题是,只要发送页面请求,Django就只能真正执行Python,而这往往不是你想做这种工作的地方。

另一种方法是为特定应用程序创build自定义pipe理命令 。 然后,您可以在必要时手动执行此操作,或者更常见地将其设置为以cron作业运行。

要创buildpipe理命令,您必须在位于应用程序内部的management/commands目录内创build一个来自Command Decended类:

 # 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) 

这个文件的名字是重要的,因为这将是命令的名字。 在这种情况下,您现在可以在命令行上调用它:

 python manage.py update_cache 

您也可以使用johnny-cache来自动caching查询集。 它将(默认情况下)caching所有的查询集,但是可以强制它不caching一些查询集。