0

attamptのクエリセットで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

itertools.islice()ジェネレータをスライスするために使用できます。COUNT(*)返されるレコードの総数を取得するには、別のクエリを実行する必要があります。

于 2012-05-09T21:57:52.007 に答える
1

iterator().count()QuerySet をジェネレーター オブジェクトに変換します。これは、添え字付けできなくなり、メソッドを持たなくなります。
そのため、QuerySet をジェネレーターに変換する前に、スライスやその他の QuerySet 固有の操作を行います (その後は、ジェネレーターを反復することによってのみジェネレーターにアクセスできます)。

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

または、イグナシオが提案したようにジェネレーターを操作することもできます

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 に答える