13

クエリセットで返されるアイテムの数を数えたいと思います。例えば

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

count() を使用せずに返されたオブジェクトの数を取得したいと思います。

その理由は、パフォーマンスを高速化し、実行するデータベース クエリの数を減らそうとしているためです。count() を使用するとデータベースに ping が送信されることに気付きましたが、これは望ましくありません。ユーザーデザインの完全なレットを既にプルしたことを考えると、返されたクエリセットに格納されているアイテムの数をカウントする方法はありませんか?

4

2 に答える 2

26

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

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

ソース

したがって、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>
>>> 
于 2012-07-07T19:24:28.440 に答える
0

Riateche はこれに答えましたが、QuerySet で len() または .count() を直接使用したくない場合は、values_list を返して len() を使用できます。

Django のドキュメントには次のように書かれています。

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

ValuesQuerySet は、少数の使用可能なフィールドの値のみが必要であり、モデル インスタンス オブジェクトの機能が必要ないことがわかっている場合に役立ちます。

これがこれ以上速いとは思えませんが、いつでも時間を計って見ることができます. テーブル内の使用可能なフィールド全体のサブセットのみを返したい場合に便利です。

于 2012-07-08T06:21:28.080 に答える