Django - cache_list的缓存查询集

时间:2011-07-11 21:07:37

标签: django django-queryset objectlistview

我在我的一个视图中手动使用object_list()方法进行分页和其他一些很酷的自动化功能。我尝试缓存巨大的查询集并处理可能影响object_list的所有内容(例如request.GET ['page']),但简单的想法如下:

def some_view(request):
qs = cache.get('key')
if qs == None:
    qs = QS.objects.filter(some_huge_query)
    cache.set('key', qs)
return object_list(queryset = qs,...)

实际上,在模板渲染期间再次执行queryset。有没有办法阻止查询集被执行?

4 个答案:

答案 0 :(得分:2)

该行:

if qs = None:

是问题所在。您将None存储在qs中,而不是检查相等性(==)。因此,qs 总是 None,并且每次都会进行r评估。

您需要将其更改为:

if qs == None:

或者,只是简单地说:

if not qs:

答案 1 :(得分:0)

您可以使用values_list将巨大的QuerySet转换为列表,然后将该列表移交给模板,这将导致重新评估QuerySet。

答案 2 :(得分:0)

您需要将已评估的查询集存储在缓存中,因此您应该调用:

cache.set('key', list(qs))

强制将查询集计算到列表中;否则它只是将查询存储在缓存中!

答案 3 :(得分:0)

据我所知:

if qs == None:

可能会评估您的查询集。至少我很确定if qsif not qs会对查询集进行评估。

尝试:

if qs is not None:

另外,查看object_list方法和模板会很有用。