我试图在我的网页中使用分页。所以我在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
条目,并且所有条目都不能立即加载。那么,有没有办法优化查询?
答案 0 :(得分:2)
如果它确实立即将所有对象加载到内存中,那么这是一个错误。只要您在将QuerySet
提供给Paginator
之前没有明确地将QuerySet
强制转换为列表,分页器只会使用一个查询获取与QuerySet
匹配的行数,然后限制{{1}}适当地仅获取要显示的那些行。
如果您确实怀疑它正在加载所有对象,要验证这一点,请使用django-debug-toolbar并查看执行的查询。如果确实加载了所有内容,那么请在Django的trac中提交一个错误。
答案 1 :(得分:1)
在settings.py中将DEBUG
设置为False
,这将显着提高您的效果。调试模式(除其他外)打开SQL缓存,这可能会大大减慢速度。