没有整个查询集的Django分页

时间:2012-11-04 00:15:35

标签: django optimization

在Django中,我使用如下的分页器:

来自django.core.paginator import Paginator,EmptyPage,PageNotAnInteger

def myView(request):
    ...
    paginator = Paginator(Annonce.objects.filter(name="huhu"), 10)
    paginator._count = s.count()
    try:
        annonces = paginator.page(page)
    except PageNotAnInteger:
        annonces = paginator.page(1)
    except EmptyPage:
        annonces = paginator.page(paginator.num_pages)

在s.search()函数中,我对postgres db进行查询。

事实证明,即使我每页显示10个项目,查询也不受限制。

我尝试使用Annonce.objects.filter(name="huhu")[:10]限制查询并自行指定计数。但是如果我这样做,分页器就不起作用了。

有没有办法对此进行优化?

1 个答案:

答案 0 :(得分:10)

使用此示例https://docs.djangoproject.com/en/dev/topics/pagination/#using-paginator-in-a-view作为编写适当使用django Paginator的视图函数的指南。

请注意,在示例代码段中 -

def listing(request):
    contact_list = Contacts.objects.all()
    paginator = Paginator(contact_list, 25) # Show 25 contacts per page

    page = request.GET.get('page')  # <--- This is the key to your solution.

contact_list是一个已分配的查询集,尚未实际评估过。对paginator = Paginator(contact_list, 25)的{​​{1}}分配是懒惰的,并且在必须执行之前不会执行。

Paginator instance从您的网址获取额外的GET变量page = request.GET.get('page')(例如)。当我们尝试检索应在您的商家信息页面上显示的25个对象时,该网址实际上看起来像?page=2

这是执行数据库实际查询的地方: -

http://localhost:8000/my/listing?page=2

try: contacts = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. contacts = paginator.page(1) 执行对数据库的查询根据给定的页码仅检索有限的一组对象,条件是我们每页需要“25”个对象