在django中缓存查询结果

Mar*_*ruz 43 django caching

我正在尝试找到一种方法来缓存不会随频率变化的查询结果.例如,来自电子商务(手机,电视等)的产品类别.我正在考虑使用模板片段缓存,但在这个片段中,我将迭代这些类别的列表.此列表可在网站的任何部分使用,因此它位于我的base.html文件中.在渲染模板时,我是否始终发送类别列表?或者是否有更动态的方法来执行此操作,使列表始终在模板中可用?

Mar*_*row 71

将缓存的查询弹出到Django的缓存中:

from django.core.cache import cache

cache.set('key', queryset)
Run Code Online (Sandbox Code Playgroud)

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

# myproject/myapp/context_processors.py

from django.core.cache import cache

def cached_queries():
    return {'cache', cache.get('key')}
Run Code Online (Sandbox Code Playgroud)

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

TEMPLATE_CONTEXT_PROCESSORS += (
    'myproject.myapp.context_processors.cached_queries'
)
Run Code Online (Sandbox Code Playgroud)

现在,您将能够访问cache所有通用模板中的变量以及具有请求上下文的所有模板,如果在视图中完成,则会给出模板:

return render_to_response('my_template.html',
                          my_data_dictionary,
                          context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

何时设置缓存

它取决于缓存中包含的内容.然而,一个常见的问题是Django只有在发送页面请求时才真正执行Python,而这通常不是你想要做这种工作的地方.

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

要创建管理命令,您必须从位于应用程序Command内部的management/commands目录内创建一个降级的类:

# 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)
Run Code Online (Sandbox Code Playgroud)

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

python manage.py update_cache
Run Code Online (Sandbox Code Playgroud)


Mat*_*kel 13

您还可以使用johnny-cache自动缓存查询集.它(默认情况下)将缓存所有查询集,但您可以强制它不缓存某些查询集.

  • 不再支持Johnny-cache,请改用[django-cachalot](http://django-cachalot.readthedocs.io/en/latest/). (10认同)