故障排除'itertools.chain'对象没有属性'__getitem__'

时间:2013-08-14 12:45:52

标签: python django

我在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!

1 个答案:

答案 0 :(得分:6)

itertools.chain()返回可迭代,而不是序列。您无法索引或切片可迭代的内容。

使用itertools.islice()定义子集;当循环遍历islice()结果时,底层的iterable将被提升到起始索引,然后将产生项目直到结束索引:

objects = islice(self.objects, page0 * self.per_page, 1 + page * self.per_page)

对链接序列进行迭代,因此您无法在start索引之前访问这些项目。