我在我的一个视图中手动使用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。有没有办法阻止查询集被执行?
答案 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 qs
或if not qs
会对查询集进行评估。
尝试:
if qs is not None:
另外,查看object_list
方法和模板会很有用。