django - Django分页器在最后一页没有响应
问题描述
在 Django 2.0 中迭代大型 QuerySet 似乎不再是一个可行的选择。我尝试使用 Django 自己的 Paginator 来加速它。
def read_from_db_4():
paginator = Paginator(DataSet.objects.filter(status_id=1).order_by('id'), 1000)
l = []
print("{} iterations!".format(paginator.num_pages))
for page in range(1, paginator.num_pages+1):
l = l + list(paginator.page(page).object_list)
print("{}, next page...".format(page))
return l
这个小功能相当快,但会在最后一页停止。
我也无法达到此页面的长度:
len(paginator.page(LASTPAGE).object_list)
这将永远挂起。我以前可以得到所有其他页面的长度。
这种奇怪行为的原因是什么?
解决方案
好的,我发现问题出在 Python MySQL 驱动程序上。
我没有使用Django 推荐的 mysqlclient。我使用的是由Oracle/MySQL创建的。似乎有一个错误会导致迭代器“卡”在for
循环中 QuerySet 的最后一个元素上,并在某些情况下陷入无限循环。
我发现是让迭代器正常运行并在它到达 QuerySet 中的最后一个元素时退出循环,例如,通过使用.iterator()
它的方法。但是,这不是我所拥有的用例的选择。
安装mysqlclient
为我解决了这个问题。请注意,当您使用 Mac 时,您还需要遵循“关于 macOS 上 MySQL Connector/C 的错误的注意事项”部分。
您可以mysql_config
在文件夹中找到/usr/local/mysql/bin
. 最初我有点被推迟了,因为该指南让您搜索该文件,我花了很长时间才找到它,看到搜索“mysql_config”会为您提供几十个关于在哪里找到my.cnf
.
推荐阅读
- go - 如何实现一次。用单例和云函数做
- html - 我们可以仅使用 CSS 更改 html 的 td 标记中数据的字体颜色吗
- android - 线程上的分片事务
- java - 如何将 dd/MM/yyyy HH:mm:ss 转换为 offsetdatetime - java
- tcl - 生成具有不同变量的随机输出
- if-statement - 识别独特的文本
- linux - 如何编辑段落中的设置?
- flutter - 每当底部导航栏项目更改时,FutureBuilder 都会重新加载
- excel - 连接除某些单元格以外的范围
- c++ - 在 VsCode 中使用 c++ 的问题(运行代码后在终端中打印错误)