我目前正在为某些设计构建一个简单的搜索方法。查询搜索作者的名称和设计的文本。问题:当数据库有300,000个设计并且我想对结果进行分页时会发生什么?如果我传递page
变量,那么每次用户切换到不同的页面时,都会再次执行查询。
解决此问题的最佳方法是什么?是否正确缓存了尽可能多的搜索?它是否在会话数据中存储了一定数量?
"""
Searches by screenname or design text
"""
def search_designs(request):
designs = None
words = None
if request.method == 'POST':
q = request.POST['search']
words = q.split()
# Get all approved designs
designs = Design.objects.filter(status=2)
for w in words:
designs = designs.filter(name__icontains=w) | designs.filter(author__profile__screenname__icontains=w)
vars = RequestContext(request,
{
'results' : designs,
'words' : words,
})
return render_to_response("search_test.html", vars)
答案 0 :(得分:2)
我会查看django-pagination。它将在模板级别为您处理分页。它很容易集成。
答案 1 :(得分:1)
所以你试图保存所有结果,所以当用户浏览页面时,不再访问数据库,对吧?由于它们是动态搜索,因此唯一的方法是缓存这些页面,尚未访问的页面仍然不会被缓存。所以唯一的好处是如果用户回到以前的页面。我认为你不会从这种做法中获得很多好处。
每次用户加载页面时都可以执行一个查询。
此外,如果您在模板上迭代查询集,则每次迭代都会到达数据库。在将查询集传递给模板之前,请使用my_query_set = list(my_query_set)来避免multiple database次点击。