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__()
方法,这可能会导致这种情况无法实现。
答案 0 :(得分:1)
你可能会这样做,但它的用途有限。
Paginator类中用于对列表进行切片以创建页面的部分位于the end of the page
method。它通过切片对象列表来做到这一点;但显然,生成器不支持切片。
所以你唯一能做的就是替换整个方法,而不是切片,你必须在生成器上反复调用next
,直到你到达你想要的页面。您可以在整个对象列表中调用list()
,但是您需要替换的代码量可能不会使得使用此类值得。