2012-05-22 8 views
20

、テンプレート内のクエリセットの長さを示しDjangoは - どのように私は、出力Iが(私のデバッグの目的のために)使用していますクエリセットのサイズ</p> <p>は、私が試したことができ、私のHTMLファイルに

{{ len(some_queryset) }} 

しかし、それは動作しませんでした。フォーマットは何ですか?

+2

何にLEN()を呼び出すための 'length'と呼ばれるフィルタがあります。 '{{any_iterable | length}}' –

+1

@ Yuji'Tomita'Tomitaだから、あなたは 'some_queryset.all | length'を使ったでしょうか?これは生成されるSQLの点で最適ですか? 'some_queryset.count'は全てのモデルフィールドを選択する代わりに' SELECT COUNT(*) '...を使います。私はパフォーマンスの面でこれがどれほど重要なのかわかりませんが、大きなクエリーで何かを推測します。これは重要な意味を持ちますか? – AJP

+2

@AJPはい。カウントを取得している場合は、some_queryset.countを実行します。とにかく既に評価されているならば、長さはあなたにdbヒットを救います。 –

答えて

41

{{ some_queryset.count }}を試してください。

これは、バックグラウンドで生成されたSQLを最適化するため、レコード自体の代わりにレコード数を取得するため、len({{ some_queryset.__len__ }}で起動可能)を使用するよりも優れています。

+0

フィルターの長さはどうですか?それは同じですか? https://docs.djangoproject.com/en/dev/ref/templates/builtins/#length – dannyroa

+1

は同じではありません!あなたは実際に長さを使用する必要があります、私の答えを確認する必要があります:http://stackoverflow.com/a/18578147/267719 – daveoncode

+1

今のところdjangoはテンプレートで '__len__'を許可していません。 – mehmet

19

some_queryset.count()または{{some_queryset.count}}です。

を使用しないでください。lenは、はるかに効率が悪いです。データベースはその作業をしている必要があります。 count()に関するドキュメントを参照してください。

しかし、バッファのアドバイスを考慮に入れて、レコードを繰り返し処理する予定の場合は、lenを使用してクエリーセットを解決し、結果の行をメインメモリに常駐させることになります。これは無駄になりませんとにかくこれらの行を訪問するからです。実際にはdb接続の待ち時間に応じてより高速になるかもしれませんが、常に測定する必要があります。

+0

'' lontを使用しないでください、それはずっと効率が悪いです.''とにかくあなたのクエリーセットを反復しようとしない限り、真です。その場合、 'count'より' len'を優先します。 [続きを読む](http://stackoverflow.com/questions/14327036/count-vs-len-on-a-django-queryset) – Medorator

2

ただ、別の答えとして、上記Yuji'Tomita'Tomitaコメント@ハイライト表示します:

何にlen()を呼び出すためlengthと呼ばれるフィルタがあります。

ですから、使用することができます

{{ some_queryset|length }} 
関連する問題

 関連する問題