django自动缓存查询集的具体和条件是什么

时间:2012-09-27 06:50:42

标签: python django caching django-queryset

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(...)

很抱歉,如果这令人困惑,我将方法粘贴两次,使其看起来像用户正在调用它两次,它只是一种方法。条目是否自动缓存?

由于

3 个答案:

答案 0 :(得分:1)

它没有缓存有两个原因:

  • 当您仅使用filter但不“循环”结果时,尚未评估查询集,这意味着缓存仍为空。
  • 即使他们会被评估它没有被缓存,因为当您第二次调用该函数时,重新创建查询集(新的局部变量),即使您在第一次调用该函数时已经创建了它。第二个函数调用不会“知道”你之前做过的事情。它只是一个新的queryset实例。在这种情况下,您可能依赖于数据库缓存。

答案 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缓存”以获得更好的结果。

你可以在这里获得更多信息

http://packages.python.org/johnny-cache/