0

我在我的一个视图中手动使用 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,...)

实际上查询集在模板渲染期间再次执行。有什么方法可以防止查询集被执行吗?

4

4 回答 4

2

该行:

if qs = None:

是问题所在。您正在存储Noneqs不是检查相等性(==)。结果,qs总是,并且每次都被重新评估 None

您需要将其更改为:

if qs == None:

或者,只是简单地:

if not qs:
于 2011-07-11T21:51:28.850 回答
0

您可以使用values_list将那个巨大的 QuerySet 变成一个列表,然后将该列表交给模板,这应该会导致 QuerySet 被重新评估。

于 2011-07-11T21:25:07.910 回答
0

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

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

强制将查询集评估为列表;否则它将仅仅是存储在缓存中的查询!

于 2011-07-11T23:07:16.910 回答
0

我所知道的:

if qs == None:

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

尝试:

if qs is not None:

object_list查看您的方法和模板也很有用。

于 2011-07-12T11:11:55.947 回答