作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
from django.core.paginator import Paginator
from .model import blog
b = blog.objects.all()
p = Paginator(b, 2)
以上代码来自Django官方分页文档。有人可以解释一下这为什么效率不低如果我有一个包含很多记录的表?上面的代码不是从数据库中获取所有内容然后将其删除吗?破坏了分页的目的...
最佳答案
Can somebody please explain me how this is not inefficient If I have a table with many records?
<强> QuerySet
懒。 blog.objects.all()
将不会从数据库中检索记录,除非您“使用”QuerySet
。但您没有这样做,因此分页器也不会这样做。您可以通过迭代查询集来“使用”查询集,调用 len(..)
将其转换为 str(..)
ing,以及一些其他功能。但只要你不这样做。 QuerySet
只是一个表示 Django 将在必要时执行的“查询”的对象。
Paginator
将构造一个QuerySet
这是您传递的查询集的切片变体。它首先会调用queryset.count()
检索对象的数量,从而创建 SELECT <b>COUNT(*)</b> FROM …
查询(因此我们不检索元素本身),然后使用看起来像 queryset[:2]
的切片变体因此看起来像 SELECT … FROM … <b>LIMIT 2</b>
。执行计数以确定存在的页面数。
简而言之,它将构造新的查询,并在数据库上执行这些查询。通常这些会限制返回的数据量。
关于python - Django 是否会为分页器功能获取所有数据库对象并使其效率低下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59564078/
我是一名优秀的程序员,十分优秀!