我在Python中使用itertools.chain
方法将几个Django Querysets
链接在一起。通过这样做,我没有触及数据库,这是我需要的有效行为。但是,我正在使用第三方库对这些结果进行分页,此库仅接受列表和查询集对象。当用链对象调用它时,我得到以下错误:
Exception Value: 'itertools.chain' object has no attribute '__getitem__'
图书馆中的一行(django-pagemore)让我疯狂的是:
objects = self.objects[page0*self.per_page:1+page*self.per_page]
这里的问题是,当使用链时,您无法对其进行切片。
我知道我可以使用list()
方法轻松地将链对象转换为列表,但这会评估整个查询集,并且内部可以包含数千个项目。
对how to calculate the size of a Python object进行一些研究后
我做了一些测试并使用sys.getsizeof(cPickle.dumps(content))
(其中content
是链中的一个对象)给我一个15,915 bytes
的值,所以包含3,000个这些对象的链需要{{ 1}} aprox!
答案 0 :(得分:6)
itertools.chain()
返回可迭代,而不是序列。您无法索引或切片可迭代的内容。
使用itertools.islice()
定义子集;当循环遍历islice()
结果时,底层的iterable将被提升到起始索引,然后将产生项目直到结束索引:
objects = islice(self.objects, page0 * self.per_page, 1 + page * self.per_page)
此对链接序列进行迭代,因此您无法在start
索引之前访问这些项目。