0

私はクエリセットを持っています。すなわち:Djangoのクエリセットフィルタ性能

print queryset.filter(name='some1').exists() 
print queryset.filter(name='some2').exists() 
print queryset.filter(name='some3').exists() 

ただし、フィルタクエリごとに、再度データベースヒットが発生します。クエリーセットをキャッシュしてからフィルタリングするにはどうしたらいいですか?

私もこれを行うことにより、フィルタリングの前にクエリセットを評価しよう: -

print len(queryset) 

しかし、これは動作しません。 ヘルプがありますか?

+0

これは3つの異なるクエリであることを意味していますか? –

+0

はい3つの異なるクエリを意味します –

+0

例でコードを修正します –

答えて

2

django ORMでは不可能です。しかし、あなたはそれをPythonで行うことができます。

queryset = list(my_object.someobject_set.all()) 

print list(filter(lambda i: i.name == 'some1', queryset)) 
print list(filter(lambda i: i.name == 'some2', queryset)) 
print list(filter(lambda i: i.name == 'some3', queryset)) 

この方法で追加のDBヒットは行われません。しかし、このクエリーセットが本当に大きい場合は、たとえdbにヒットしたとしても、ORMでそれを行う方が良いです。あなた自身のために時間をとって、どちらが速いかを確認してください。

+1

すべての列をメモリにフェッチする必要はありません。代わりに 'only'を使います。 – itzMEonTV

+0

@itzmeontv値が存在するかどうかを確認したいとは思っていません。しかし、はい、もしこれが「唯一」を確認するためだけに必要なのが行く方法です。 –

+0

あなたはどう思いますか?リストをループしてフィールドを確認するvs '存在する'クエリdb?あなたの知識からの答え? :) – itzMEonTV