首页 > 解决方案 > 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)

这将永远挂起。我以前可以得到所有其他页面的长度。

这种奇怪行为的原因是什么?

标签: djangodjango-modelsdjango-orm

解决方案


好的,我发现问题出在 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.


推荐阅读