加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-16 23:44:44 所属栏目:Python 来源:网络整理
导读:有一些 django分页的代码示例,我用了一会儿.我可能是错的,但是当查看代码时,它会浪费大量的内存.我正在寻找一个更好的解决方案,这里是代码: # in views.pyfrom django.core.paginator import Paginator,EmptyPage,PageNotAnInteger... ... def someView():
有一些 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 ....)

我不确定这个代码的细微之处,但从它的外观上来看,第一行代码从数据库中检索每一个模型并将其推入.然后它被传递到Paginator,根据用户从html GET开始的页面将其分组.分母不知何故使这可以接受,还是这完全记忆效率低下?如果效率低下,怎么可以改进?

另外,一个相关话题.如果有人做:

Model.objects.all()[:40]

这个代码是否意味着所有模型都被推入内存,我们拼接出40个?哪个是坏的还是意味着我们仅查询并推送40个对象到内存期?

感谢您的帮助!

解决方法

mymodel.objects.all()产生一个查询,而不是列表. Querysets是懒惰 – 没有要求发出,没有任何事情,直到你真正尝试使用它们.另外,切片查询集不会在内存中加载完整的内容,只能获取一个子集,但在击中数据库之前会向SQL查询添加限制和偏移量.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读