Python Django分页。如果我有一百万行呢?

Python Django分页。如果我有一百万行呢?,python,django,optimization,pagination,Python,Django,Optimization,Pagination,Django官方文档为我们提供了如下信息: from django.core.paginator import Paginator my_list = MyModel.objects.all() p = Paginator(my_list, 10) 但是。如果我必须对一百万行进行分页怎么办?每次我想查看一个分页的页面时,用MyModel.objects.all()加载100万行不是很有效 有没有一种更有效的方法可以做到这一点,而不需要调用objects.all()来进行简单的分页?MyMode

Django官方文档为我们提供了如下信息:

from django.core.paginator import Paginator
my_list = MyModel.objects.all()
p = Paginator(my_list, 10)
但是。如果我必须对一百万行进行分页怎么办?每次我想查看一个分页的页面时,用MyModel.objects.all()加载100万行不是很有效

有没有一种更有效的方法可以做到这一点,而不需要调用objects.all()来进行简单的分页?

MyModel.objects.all()
实际上并不加载所有对象。它可能会加载所有这些操作,但在您实际执行需要对其进行评估的操作之前,它不会执行任何操作

分页器几乎肯定会对该查询集添加一些限制。例如,使用数组切片表示法,它可以创建一个新对象,如下所示

my_list = MyModel.objects.all()
smaller_list = my_list[100:200]
这将创建一个不同的查询集,它将只从数据库请求100个项目。或者对原始查询集调用
.count()
,这将指示数据库返回表中的行数

您必须执行一些需要检索所有对象的操作,比如调用

list(my_list)
获取要从数据库传输到Python的1000000行。

MyModel.objects.all()
实际上不会加载所有对象。它可能会加载所有这些操作,但在您实际执行需要对其进行评估的操作之前,它不会执行任何操作

分页器几乎肯定会对该查询集添加一些限制。例如,使用数组切片表示法,它可以创建一个新对象,如下所示

my_list = MyModel.objects.all()
smaller_list = my_list[100:200]
这将创建一个不同的查询集,它将只从数据库请求100个项目。或者对原始查询集调用
.count()
,这将指示数据库返回表中的行数

您必须执行一些需要检索所有对象的操作,比如调用

list(my_list)

将1000000行从数据库传输到Python。

我是否使用Ajax无关紧要。我的问题是每次在分页中加载一个页面时加载一百万行的效率。我是否使用Ajax无关紧要。我的问题是每次在分页中加载一个页面时加载100万行的效率。谢谢。我不知道当我得到一个查询集时,它不会连接到数据库,除非我进行打印、迭代等操作。@edwardoyarzun::“创建
QuerySet
的行为不涉及任何数据库活动。你可以整天将过滤器堆叠在一起,Django在计算
QuerySet
之前不会真正运行查询。“谢谢。我不知道当我得到一个QuerySet时,它不会连接到数据库,除非我进行打印、迭代等操作。@edwardoyarzun:”创建
QuerySet
的行为不涉及任何数据库活动。您可以整天将过滤器堆叠在一起,Django在计算
QuerySet
之前不会实际运行查询。”