我在一个视图中手动使用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在模板呈现期间再次执行。是否有任何方法可以防止查询集被执行?
一行:
if qs = None:
是问题所在。您将None
存储在qs
中,而不是检查是否相等(==
)。因此,qs
总是 None
,并且每次都通过。
你需要把它改成:
if qs == None:
或者,简单地:
if not qs:
您可以使用values_list将庞大的QuerySet转换为列表,然后将该列表交给模板,这将导致QuerySet被重新求值。
您需要将求值的查询集存储在缓存中,因此您应该调用:
cache.set('key', list(qs))
强制将查询集求值为列表;否则,它将仅仅是存储在缓存中的查询!
据我所知:
if qs == None:
可能会计算您的查询集。至少我很确定if qs
或if not qs
评估查询集。
试题:
if qs is not None:
也可以看到你的object_list
方法和模板。