django中的高效分页和数据库查询

Luc*_*ang 13 python django pagination querying

django分页有一些代码示例,我曾经使用过一段时间.我可能错了,但在查看代码时,它看起来好像浪费了大量的内存.我一直在寻找更好的解决方案,这里是代码:

# in views.py
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

... 
...    

def someView():
    models = Model.objects.order_by('-timestamp')
    paginator = Paginator(models, 7)
    pageNumber = request.GET.get('page')

    try: 
        paginatedPage = paginator.page(pageNumber)
    except PageNotAnInteger: 
        pageNumber = 1
    except EmptyPage: 
        pageNumber = paginator.num_pages
    models = paginator.page(pageNumber)

    return render_to_resp ( ..... models ....)
Run Code Online (Sandbox Code Playgroud)

我不确定这段代码的细节,但从它的外观来看,第一行代码从数据库中检索每一个模型并将其推入.然后,它被传递到分页程序这豆腐块它基于该页面的用户是从一个HTML的GET.分页符是否以某种方式使这个可以接受,或者这完全是内存效率低下的?如果效率低下,怎么改进?

另外,一个相关的主题.如果有人这样做:

   Model.objects.all()[:40]
Run Code Online (Sandbox Code Playgroud)

这段代码是否意味着所有模型都被推入内存,我们将其中的40个拼凑出来?这很糟糕.或者它是否意味着我们只查询并将40个对象推入内存期?

谢谢您的帮助!

bru*_*ers 19

mymodel.objects.all()产生一个查询集,而不是一个列表.查询集是懒惰的 - 在您实际尝试使用它们之前,不会发出任何请求,也不会执行任何操作.切片查询集也不会在内存中加载整个该死的东西只是为了得到一个子集,但在命中数据库之前会在SQL查询中添加限制和偏移量.