2012-07-07 9 views
7

クエリセットで返されるアイテムの数をカウントしたいと思います。例カウントなしでクエリセット内のアイテム数をカウントする方法

userdesigns = Design.objects.filter (desadder = user.id)

のために私は、オブジェクトの数は、カウントを使用してずにを返さ取得したいのですが()。

私はパフォーマンスを向上させ、実行するデータベースクエリの数を減らそうとしており、count()を使用してデータベースにpingしたくないことに気づきました。私はすでにuserdesignsの完全なものを引っ張ったので、返されたクエリーセットに格納されているアイテムの数を数える方法はないはずですか?

答えて

16

len()。 QuerySetは、len()を呼び出すと評価されます。予想通り、結果リストの長さを返します。

注:クエリーセットでlen()を使用しないでください。セット内のレコード数を決定するだけです。 SQLのSELECT COUNT(*)、 を使用してデータベースレベルでカウントを処理する方がはるかに効率的です 、Djangoは正確にcount()メソッドを提供しています。下記の count()を参照してください。

Source

あなたがlen(userdesigns)代わりのuserdesigns.count()を呼び出すのであれば、Djangoは、単一のクエリ内のテーブルからすべての関連データを要求します。その後、userdesigns変数のすべての項目にアクセスできます。追加のクエリは作成されません。

>>> m = Model1.objects.filter(desadder=1) 
>>> len(m) 
(0.000) SELECT "app1_model1"."id", "app1_model1"."desadder", "app1_model1"."test" FROM "app1_model1" WHERE "app1_model1"."desadder" = 1 ; args=(1,) 
2 
>>> m[0] 
<Model1: Model1 object> 
>>> m = Model1.objects.filter(desadder=1) 
>>> len(m) 
(0.000) SELECT "app1_model1"."id", "app1_model1"."desadder", "app1_model1"."test" FROM "app1_model1" WHERE "app1_model1"."desadder" = 1 ; args=(1,) 
2 
>>> m[0] 
<Model1: Model1 object> 
>>> 
+0

ああ、面白いです。上記のクエリを実行するのではなく、get-goの 'len()'を使うだけで、 'userdesigns 'のすべての項目が乗って来るだろうと言っていますか? – user1328021

+0

はい。私はdjangoシェルの例を追加しました。 –

+1

"パフォーマンスを向上させ、実行するデータベースクエリの数を減らそうとしているから" => Queryset.select_relatedも使用することを学ぶことができます。 –

0

Riatecheはこれを答えていますが、クエリセット上で直接)LEN()または.countを(使用したくなかった場合、あなたはvalues_listを返すことができて、その上に()LENを使用しています。

Djangoのドキュメントは言う:あなたがのみ利用可能なフィールドの数が少ないから 値が必要になるだろうし、必要でないことを知っているとき

https://docs.djangoproject.com/en/dev/ref/models/querysets/

A ValuesQuerySetが便利です モデルインスタンスオブジェクトの機能

私はこれがもう少し速いのではないかと疑いますが、いつでもそれを見て、見ることができます。使用可能な合計フィールドのサブセットのみをテーブルに戻す場合に便利です。

関連する問題