0

我正在尝试通过在我的查询集上使用 iterator() 来优化我的 Web 应用程序以节省内存。

但是,如果我这样做:

q = (
    Q(longname__icontains = query) |
    Q(genus__icontains = query) |
    Q(specific_epithet__icontains = query) |
    Q(infraspecific_epithet__icontains = query) |
    Q(collectedby__personname__icontains = query) |
    Q(islandname__icontains = query) |
    Q(es_name__icontains = query) |
    Q(en_name__icontains = query) |
    Q(local_name__icontains = query)
)
query_set = Specimen.objects.filter(q).order_by('longname').iterator()[:1000]

我收到以下错误:

TypeError at /search/
'generator' object is not subscriptable

如果我尝试:

query_set.count()

我得到:

AttributeError at /search/
'generator' object has no attribute 'count'

我的问题是 - 我如何在这种类型的查询上使用迭代器,它真的值得吗?

非常感谢任何帮助。

4

2 回答 2

1

iterator()将 QuerySet 转换为生成器对象,该对象不再可下标且没有.count()方法。
在将 QuerySet 转换为生成器之前,切片和其他特定于 QuerySet 的操作也是如此(之后您只能通过迭代来访问生成器):

query_set = Specimen.objects.filter(q).order_by('longname')[:1000].iterator()

或者您可以按照 Ignacio 的建议对发电机进行操作

query_set = Specimen.objects.filter(q).order_by('longname').iterator()
from itertools import islice
g = islice(query_set, 1000)
于 2012-05-10T01:10:35.520 回答
1

您可以使用itertools.islice()切片生成器。您将需要执行单独的COUNT(*)查询以获取返回的记录总数。

于 2012-05-09T21:57:52.007 回答