gpt4 book ai didi

Django - 在 request.session 中存储查询集仍然查询数据库 - 为什么?

转载 作者:行者123 更新时间:2023-12-01 12:57:43 25 4
gpt4 key购买 nike

def mysearch(request):
"""This view builds a Q object query based on which fields are filled."""
if 'submit' in request.POST:
# build Q object depending on fields submitted
q = Q()
if request.POST['first_field']:
q &= Q(firstfield__icontains = request.POST['first_field'])

...

if request.POST['sixth_field']:
q &= Q(sixthfield__icontains = request.POST['sixth_field'])

results_list = MyModel.objects.filter(q)
count = len(results_list)

# store results
request.session['results_list'] = results_list
request.session['count'] = count

# 'p' is an arbitrary marker to detonate pagination of a page other than 1
if 'p' in request.GET:
results_list = request.session['results_list']
count = request.session['count']

if count and count > 0:
...
# pagination code
...

else:
pass
return render_to_response('search_results.html',
locals(), context_instance=RequestContext(request))

使用分页器在我的模板中一切正常。问题是 Django 调试工具栏告诉我,我在页面 > 1 上访问数据库的次数与在第一页上访问的次数相同。为什么是这样?事实上 - 为什么它会访问数据库?难道不应该从 request.session 中提取整个 results_list 吗?非常感谢任何建议。

最佳答案

您正在 session 中保存一个queryset 对象。查询集类似于 SQL 语句,但它们缓存结果。当您将查询放入 session 时,您还没有运行查询,因此您存储的实际上只是查询。当它被拉出时,它仍然只是一个没有运行的查询,所以查询集会再次运行。为确保您只存储实际结果,请执行以下操作:

request.session['results_list'] = list(results_list)

并在您找到 count 时为您节省另一个查询,您可以...

request.session['count'] = len(request.session['results_list'])

另请记住, session 数据(默认情况下)保存在数据库中,因此存储完整数据的 python pickled 表示可能不会给自己带来任何好处。实际上,仅转到原始表并以这种方式将其拉出可能会更快。

关于Django - 在 request.session 中存储查询集仍然查询数据库 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8735452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com