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.