如何在django中每页检索10个项目
我正在尝试在我的网页中使用分页。所以我在django文档中找到了一个例子 .如何在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仅获取要显示的行 如果您确实怀疑它正在加
示例中的问题是,他一次加载所有项目以分页。但是在我的数据库中有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})