Python 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

我需要对所有检索到的数据进行真正的分页,而不是分页。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 = 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语句have
LIMIT
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。但谢谢你,我不知道。