你如何对Django中的动态搜索结果进行分页?

时间:2010-03-10 23:47:58

标签: database django caching

我目前正在为某些设计构建一个简单的搜索方法。查询搜索作者的名称和设计的文本。问题:当数据库有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)

2 个答案:

答案 0 :(得分:2)

我会查看django-pagination。它将在模板级别为您处理分页。它很容易集成。

答案 1 :(得分:1)

所以你试图保存所有结果,所以当用户浏览页面时,不再访问数据库,对吧?由于它们是动态搜索,因此唯一的方法是缓存这些页面,尚未访问的页面仍然不会被缓存。所以唯一的好处是如果用户回到以前的页面。我认为你不会从这种做法中获得很多好处。

每次用户加载页面时都可以执行一个查询。

此外,如果您在模板上迭代查询集,则每次迭代都会到达数据库。在将查询集传递给模板之前,请使用my_query_set = list(my_query_set)来避免multiple database次点击。