【问题标题】:How do you paginate results from a dynamic search in Django?如何对 Django 中的动态搜索结果进行分页?
【发布时间】:2010-03-10 23:47:57
【问题描述】:

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

【问题讨论】:

标签: database django caching


【解决方案1】:

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

【讨论】:

  • 我不担心分页是一个单一的概念(我已经建立了自己的),我关心的是如何通过动态搜索结果保持“状态”。否则,每次你转到一个页面时,你实际上是在说“Django,再次搜索整个数据库以获得相同的结果并给我页面 (x)”
  • django-pagination 如果正确完成将只检索当前页面所需的对象。可能是你写的没做好?
  • 不需要自己创建分页,这个就很好了。因为QuerySets 是惰性的,所以只要您不在视图中执行任何强制评估的操作,只会从数据库中获取必要的项目。
【解决方案2】:

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

每次用户加载页面时执行一个查询是完全没问题的。

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

【讨论】:

  • Luiz,文档指出:“QuerySet 是可迭代的,它会在您第一次迭代它时执行其数据库查询。”感谢您让我知道 list() 。很高兴知道这一点。
猜你喜欢
  • 2016-06-13
  • 1970-01-01
  • 2013-05-04
  • 2021-05-22
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多