缓存object_list的查询集



我在一个视图中手动使用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 qsif not qs评估查询集。

试题:

if qs is not None:

也可以看到你的object_list方法和模板。

相关内容

  • 没有找到相关文章

最新更新