我在用着itertools.chain
Python 中链接多个 Django 的方法Querysets
一起。通过这样做,我不会接触数据库,这是我需要的有效行为。但是,我使用第三方库对这些结果进行分页,并且该库仅接受列表和查询集对象。当使用链对象调用它时,出现以下错误:
Exception Value: 'itertools.chain' object has no attribute '__getitem__'
图书馆中的线路(django-pagemore https://github.com/pennersr/django-pagemore/blob/master/pagemore/templatetags/pagemore.py#L106)实际上让我发疯的是:
objects = self.objects[page0*self.per_page:1+page*self.per_page]
这里的问题是,当使用链条时,你不能将其切片。
我知道我可以轻松地将链对象转换为列表list()
方法,但这将评估整个查询集,并且其中可能包含数千个项目。
经过一番研究后如何计算Python对象的大小 https://stackoverflow.com/a/565382/955619我做了一些测试和使用sys.getsizeof(cPickle.dumps(content))
(where content
是链内的对象之一)给我的值为15,915 bytes
,因此包含 3,000 个此类对象的链需要45.53 MB
aprox!
itertools.chain()
返回一个iterable,不是一个序列。您无法对可迭代对象进行索引或切片。
Use itertools.islice() http://docs.python.org/2/library/itertools.html#itertools.islice定义一个子集;当循环遍历时islice()
结果,底层迭代将前进到起始索引,然后将产生项目直到结束索引:
objects = islice(self.objects, page0 * self.per_page, 1 + page * self.per_page)
This iterates在链接序列上,因此您无法访问之前的项目start
index.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)