Python Django分页
我需要对所有检索到的数据进行真正的分页,而不是分页。Django文档站点中的示例如下:Python Django分页,python,django,mongodb,django-pagination,Python,Django,Mongodb,Django Pagination,我需要对所有检索到的数据进行真正的分页,而不是分页。Django文档站点中的示例如下: def listing(request): contact_list = Contacts.objects.all() paginator = Paginator(contact_list, 25) # Show 25 contacts per page page = request.GET.get('page') try: contacts = pagina
def listing(request):
contact_list = Contacts.objects.all()
paginator = Paginator(contact_list, 25) # Show 25 contacts per page
page = request.GET.get('page')
try:
contacts = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
contacts = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
contacts = paginator.page(paginator.num_pages)
return render_to_response('list.html', {"contacts": contacts})
此代码正在对所有检索的记录进行分页。但是有一个麻烦。如果有这么多记录,尝试检索所有记录需要很多时间。我需要一个解决方案从数据库中逐页检索记录
在Django中是否有其他解决方案可以做到这一点?查看Paginator类(Django/core/Paginator.py)内部,它只获取所需的页面。大表上只有一个问题:如果要显示总页码,必须对整个表进行计数(*),这在某些数据库中可能需要很长时间(即postgresql、mysql和innodb)
顺便说一句,试着在django中使用通用视图,在这里就可以了。你的假设是错误的。Django在分页时不会检索所有对象:它会对查询集进行适当的切片,这会对SQL使用限制和计数。A
queryset
是一个惰性对象。分配contact\u list=Contacts.objects.all()
时,Django不会命中数据库。在调用诸如count()
、filter()
、first()
、…、或联系人列表[1:5]
等方法之前,Django将真正从数据库中检索数据。Django生成的SQL语句将与每个方法关联,这些SQL语句将被发送到DB
例如:contact\u list[1:5]
生成一个SQL语句haveLIMIT
和OFFSET
子句
在Paginator
类中,QuerySet
将传递给its构造函数
paginator = Paginator(contact_list, 25)
调用paginator.page(page)
时,该语句被调用:
return self._get_page(self.object_list[bottom:top], number, self)
这里我们使用
get_page()
获取页面数据(1页包含25个数据)。我建议如下:
def listing(request):
contact_list = Contacts.objects.all()
paginator = Paginator(contact_list, 25) # Show 25 contacts per page
page = request.GET.get('page')
contacts = paginator.get_page(page)
return render_to_response('list.html', {"contacts": contacts})
这个问题以前已经回答过了,看这里:你的意思是;代码中的Contacts.objects.all()行有问题,没有检索到所有记录?正确。正如文档所解释的,查询集是惰性的,在对它们进行迭代或切片之前不会进行db调用。这可能是针对SQL数据库的,而不是Mongo fork。因为我试过了,它仍然从数据库中检索所有数据。DJango可能缺少Mongo fork。但谢谢你,我不知道。