Django paginator 在最后一页没有响应
Django paginator not responsive on last page
迭代大型 QuerySet 似乎不再是 Django 2.0 中的可行选项。
我尝试使用 Django 自己的分页器来加快速度。
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 recommended mysqlclient。
我使用的是 Oracle/MySQL 创建的那个。似乎有一个错误导致迭代器在 for
循环中获取 QuerySet 的最后一个元素 "stuck" 并在某些情况下陷入无限循环。
我发现让迭代器正常运行并在它到达 QuerySet 中的最后一个元素时退出循环,例如,通过对其使用 .iterator()
方法。但是,对于我的用例,这不是一个选项。
安装 mysqlclient
解决了我的问题。请注意,当您使用 Mac 时,您还需要遵循 "Note about bug of MySQL Connector/C on macOS" 部分。
您可以在文件夹 /usr/local/mysql/bin
中找到 mysql_config
。最初我有点迟疑,因为该指南让你搜索文件,我花了很长时间才找到它,看到搜索 "mysql_config" 会给你很多关于在哪里找到的结果my.cnf
.
迭代大型 QuerySet 似乎不再是 Django 2.0 中的可行选项。 我尝试使用 Django 自己的分页器来加快速度。
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 recommended mysqlclient。
我使用的是 Oracle/MySQL 创建的那个。似乎有一个错误导致迭代器在 for
循环中获取 QuerySet 的最后一个元素 "stuck" 并在某些情况下陷入无限循环。
我发现让迭代器正常运行并在它到达 QuerySet 中的最后一个元素时退出循环,例如,通过对其使用 .iterator()
方法。但是,对于我的用例,这不是一个选项。
安装 mysqlclient
解决了我的问题。请注意,当您使用 Mac 时,您还需要遵循 "Note about bug of MySQL Connector/C on macOS" 部分。
您可以在文件夹 /usr/local/mysql/bin
中找到 mysql_config
。最初我有点迟疑,因为该指南让你搜索文件,我花了很长时间才找到它,看到搜索 "mysql_config" 会给你很多关于在哪里找到的结果my.cnf
.