Django核心分页是否先检索所有数据?
我正在使用django 1.5版本。我需要把页面的数据进行分页。我看了文档,在这里。我不太确定它是否会先把所有数据都取出来。因为我的表格数据量很大,所以使用类似“限制”的方法会更好。谢谢。
编辑
我在ModelManager中使用了查询集(queryset)。
示例:
class KeywordManager(models.Manager):
def currentkeyword(self, kw, bd, ed):
wholeres = super(KeywordManager, self).get_query_set() \
.values("sc", "begindate", "enddate") \
.filter(keyword=kw, begindate__gte=bd, enddate__lte=ed) \
.order_by('enddate')
return wholeres
2 个回答
0
如果你的数据不是来自数据库,那么是的,分页器需要先加载所有信息,才能决定怎么“分割”这些数据。
如果你是直接用Django自动生成的SQL与数据库交互,那么分页器会执行一个查询,来确定数据库中有多少条数据(也就是执行一个SQL的COUNT()
)。然后,它会根据你提供的值来决定生成多少页。例如:如果count()
返回43,而你想每页显示10条结果,那么生成的页数就是:43 % 10 + 1 = 5
。
3
首先,queryset
是一个懒惰的对象,也就是说,Django 只有在你需要数据的时候才会去数据库里取数据。如果你不去请求它,Django 就不会去访问数据库。如果你对 queryset
使用一些列表的方法,比如 len()
,那么它会把所有的数据都取出来,这样就会强制 Django 去数据库里获取所有的数据。
如果你把一个 queryset
传给分页器(Paginator),它不会一次性取出所有的数据。因为文档上说,如果你传的是 queryset
,它会使用 .count() 方法,这样就避免了把 queryset
转换成列表,也就不需要使用 len()
方法了。