Django在他们的文档中声明所有查询集都是自动缓存的,https://docs.djangoproject.com/en/dev/topics/db/queries/#caching-and-querysets。但是他们并没有特定于这个功能的细节。
他们提供的示例是将qs保存在python变量中,并且在第一个之后的后续调用将从缓存中获取。
queryset = Entry.objects.all()
print([查询集中p的p.headline])#评估查询集 print([查询集中p的p.pub_date])#重新使用评估中的缓存。
因此,即使在用户加载视图时没有变量而进行了两次精确的queryset调用,结果也不会被缓存?
# When the user loads the homepage, call number one (not cached)
def home(request):
entries = Entry.objects.filter(something)
return render_to_response(...)
# Call number two, is this cached automatically? Or do I need to import cache and
# manually do it? This is the same method as above, called twice
def home(request):
entries = Entry.objects.filter(something)
return render_to_response(...)
很抱歉,如果这令人困惑,我将方法粘贴两次,使其看起来像用户正在调用它两次,它只是一种方法。条目是否自动缓存?
由于
答案 0 :(得分:1)
它没有缓存有两个原因:
filter
但不“循环”结果时,尚未评估查询集,这意味着缓存仍为空。答案 1 :(得分:1)
您正确给出的queryset
示例表明querysets
被懒惰地评估,即第一次使用它们。因此,当随后再次使用时,在分配给变量时,它们不会在同一流程中进行评估。这不是完全缓存,只要重新使用已评估的表达式,只要它以优化的方式可用。
对于您正在查看的缓存类型,即两次调用的相同视图,您需要在第一次获取数据库对象时手动缓存该数据库对象。 Memcached对此有好处。然后检查并获取如下例所示。
def view(request):
results = cache.get(request.user.id)
if not results:
results = do_a_ton_of_work()
cache.set(request.user.id, results)
当然,从代理服务器到每个网址缓存,有很多其他方法可以在不同级别进行缓存。什么都适合你。 Here是关于这个主题的好读物。
答案 2 :(得分:0)
Memcached是内置模块,它运行良好,但即使您可以尝试“johnny缓存”以获得更好的结果。
你可以在这里获得更多信息