如何在django中每页只检索10个项目

时间:2012-05-09 08:25:21

标签: django django-models query-optimization django-queryset

我试图在我的网页中使用分页。所以我在django文档中找到了一个例子 here

from django.core.paginator import Paginator, InvalidPage, EmptyPage

def listing(request):
    contact_list = Contacts.objects.all()
    paginator = Paginator(contact_list, 25) # Show 25 contacts per page

    # Make sure page request is an int. If not, deliver first page.
    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    # If page request (9999) is out of range, deliver last page of results.
    try:
        contacts = paginator.page(page)
    except (EmptyPage, InvalidPage):
        contacts = paginator.page(paginator.num_pages)

    return render_to_response('list.html', {"contacts": contacts})

示例中的问题是他一次加载所有项目以进行分页。但是在我的数据库中有20000条目,并且所有条目都不能立即加载。那么,有没有办法优化查询?

2 个答案:

答案 0 :(得分:2)

如果它确实立即将所有对象加载到内存中,那么这是一个错误。只要您在将QuerySet提供给Paginator之前没有明确地将QuerySet强制转换为列表,分页器只会使用一个查询获取与QuerySet匹配的行数,然后限制{{1}}适当地仅获取要显示的那些行。

如果您确实怀疑它正在加载所有对象,要验证这一点,请使用django-debug-toolbar并查看执行的查询。如果确实加载了所有内容,那么请在Django的trac中提交一个错误。

答案 1 :(得分:1)

在settings.py中将DEBUG设置为False,这将显着提高您的效果。调试模式(除其他外)打开SQL缓存,这可能会大大减慢速度。

相关问题