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

如何在django中每页检索10个项目,django,django-models,query-optimization,django-queryset,Django,Django Models,Query Optimization,Django Queryset,我正在尝试在我的网页中使用分页。所以我在django文档中找到了一个例子 . 示例中的问题是,他一次加载所有项目以分页。但是在我的数据库中有20000个条目,不能一次加载所有条目。那么,有没有办法优化查询呢?如果它确实一次将所有对象加载到内存中,那么它就是一个bug。只要在将QuerySet馈送到Paginator之前没有将QuerySet显式强制转换为列表,Paginator只使用一个查询获取与QuerySet匹配的行数,然后适当地限制QuerySet仅获取要显示的行 如果您确实怀疑它正在加

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


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

如果它确实一次将所有对象加载到内存中,那么它就是一个bug。只要在将
QuerySet
馈送到
Paginator
之前没有将
QuerySet
显式强制转换为列表,Paginator只使用一个查询获取与
QuerySet
匹配的行数,然后适当地限制
QuerySet
仅获取要显示的行


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

如果它确实一次将所有对象加载到内存中,那么它就是一个bug。只要在将
QuerySet
馈送到
Paginator
之前没有将
QuerySet
显式强制转换为列表,Paginator只使用一个查询获取与
QuerySet
匹配的行数,然后适当地限制
QuerySet
仅获取要显示的行


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

在settings.py中将
DEBUG
设置为
False
,这将显著提高您的性能。调试模式(除其他外)打开SQL缓存,这会大大降低速度。

在settings.py中将
Debug
设置为
False
,这将显著提高性能。调试模式(除其他外)打开SQL缓存,这会大大降低速度。

您确定它一次加载所有项吗?QuerySets()是懒惰的:我认为是这样,当我的数据库中有
1000个
条目时,它通常加载得更快。现在,当项目大小增加到
20000
时,其加载速度非常慢。您尝试过交互式shell吗?尝试一点一点地执行代码(记住不要键入“contact_list”,因为这将加载queryset中的所有项目)。你可能会看到到底哪个部分花了这么长时间。祝你好运您确定它正在同时加载所有项目吗?QuerySets()是懒惰的:我认为是这样,当我的数据库中有
1000个
条目时,它通常加载得更快。现在,当项目大小增加到
20000
时,其加载速度非常慢。您尝试过交互式shell吗?尝试一点一点地执行代码(记住不要键入“contact_list”,因为这将加载queryset中的所有项目)。你可能会看到到底哪个部分花了这么长时间。祝你好运
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})