3

我正在使用itertools.chainPython 中的方法将几个 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()方法轻松地将链对象转换为列表,但这会评估整个查询集,并且其中可以包含数千个项目。

在对如何计算 Python 对象的大小进行了一些研究之后, 我做了一些测试和使用sys.getsizeof(cPickle.dumps(content))content链中的一个对象在哪里)给了我一个值15,915 bytes,因此包含 3,000 个这些对象的链需要45.53 MBaprox!

4

1 回答 1

6

itertools.chain()返回一个可迭代的,而不是一个序列。您不能对可迭代对象进行索引或切片。

用于itertools.islice()定义子集;当遍历islice()结果时,底层的迭代将被推进到起始索引,然后将产生项目直到结束索引:

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

会遍历链式序列,因此您无法访问start索引之前的项目。

于 2013-08-14T12:50:47.700 回答