Django核心分页是否先检索所有数据?

2 投票
2 回答
2415 浏览
提问于 2025-04-18 18:09

我正在使用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() 方法了。

撰写回答