【问题标题】:Using a generator with Django's Paginator使用带有 Django 分页器的生成器
【发布时间】:2017-09-12 01:45:15
【问题描述】:

Django 的 Paginator 是否可以使用 Python 生成器?

例如,假设我有一个生成器,它会自动对 API 的请求分页,如下所示:

def get_response():
    page_one = requests.get('http://example.com/json?page=1')
    for item in page_one:
        yield item

    page_two = requests.get('http://example.com/json?page=2')
    for item in page_two:
        yield item

可以扩展 Django 的 Paginator 以支持此生成器吗?

generator = get_response()
paginator = Paginator(generator, 10)

我知道这种方法会奏效:

paginator = Paginator(list(generator), 10)

我的理解是直接传递生成器会更有效,因为 API 客户端在需要之前不会发出请求。虽然我知道分页器需要 count()__len__() 方法,这可能会使这不可能。

【问题讨论】:

  • Alex,您需要更新您的个人资料...
  • 除了长度检查之外,分页器还使用切片表示法来获取每个页面。我认为你最终会重新实现分页器的很大一部分,以改变它在可以合理有效地处理这两种情况的东西上工作的假设。

标签: python django pagination generator paginator


【解决方案1】:

你也许可以这样做,但它的用处有限。

Paginator 类中对列表进行切片以创建页面的部分位于the end of the page method。它通过对对象列表进行切片来做到这一点;但显然,生成器不支持切片。

所以你唯一能做的就是替换整个方法,而不是切片,你必须在生成器上反复调用next,直到你到达你想要的页面。你会比在整个对象列表上调用 list() 获得好处,但是你需要替换的代码量可能根本不值得使用这个类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 2020-11-28
    • 2018-07-10
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2015-03-08
    • 2013-10-18
    相关资源
    最近更新 更多