【问题标题】:Django pagination. What if I have 1 million of rows?Django 分页。如果我有 100 万行怎么办?
【发布时间】:2014-05-23 08:57:05
【问题描述】:

官方的 Django 文档给了我们这样的东西:

from django.core.paginator import Paginator
my_list = MyModel.objects.all()
p = Paginator(my_list, 10)

但是。如果我必须对 100 万行进行分页怎么办?每次我想查看单个分页页面时,使用 MyModel.objects.all() 加载 100 万行并不是那么有效。

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

【问题讨论】:

  • 我是否使用 Ajax 并不重要。我的问题是每次在分页中加载单个页面时加载 100 万行时的效率。

标签: python django optimization pagination


【解决方案1】:

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

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

my_list = MyModel.objects.all()
smaller_list = my_list[100:200]

这将创建一个不同的查询集,它只会从数据库中请求 100 个项目。或者在原始查询集上调用.count(),它只会指示数据库返回表中的行数。

你必须做一些需要检索所有对象的事情,比如调用

list(my_list)

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

【讨论】:

  • 谢谢。我不知道当我得到一个 QuerySet 时,它不会连接到数据库,除非我进行打印、迭代等操作。
  • @edwardoyarzun: QuerySets are lazy: “创建QuerySet 的行为不涉及任何数据库活动。您可以整天堆叠过滤器,Django 不会实际运行查询直到 QuerySet评估。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多