使用Django的Paginator生成器

时间:2017-09-11 17:13:16

标签: python django pagination generator paginator

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客户端在需要之前不会发出请求。虽然我知道Paginator需要使用count()__len__()方法,这可能会导致这种情况无法实现。

1 个答案:

答案 0 :(得分:1)

你可能会这样做,但它的用途有限。

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

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