2017-10-18 6 views
1

テンプレートにforループがあります。私は最初の3つの項目をブログのループに表示したいだけです。django forループをテンプレートまたはビューで制限してパフォーマンスを向上させますか?

は、現時点では唯一の20のブログのエントリがありますが、ブログのエントリは、パフォーマンスの観点から、500以上を言うのであれば、それはviews.pyコードまたはテンプレートコードでループを制限するために良いですか?ここで

blog_latest_entries = BlogDetails.objects.filter(blog_date_published__lte=date_now).order_by('-blog_date_published')[:3] 
..... 
return render(request, 'page.html', { 
    'blog': blog_details_latest_entries, 

テンプレートコードで制限されています:

{% for blog in blog|slice:"3" %} 

パフォーマンスのために最適なオプションは

ここviews.pyファイルのループ限度があります。私は、views.pyのアプローチを疑っていますが、本当の知識を持っている人が私の疑惑を後押ししたいと思います。

ありがとうございました。

+0

を使用するよりも、同じである、 'slice'は、リストの要素を制限するために最善の方法です。 – Deadpool

+0

同じです。 Django Debug Toolbarを使って、Luke! –

+3

ビュー内のqを制限します。両方の場合にSQL文が実行されますが、制限されたSQL文は高速で重すぎるものではありません。テンプレートのqをカットすると同じ出力が得られますが、最初の3つの要素が必要な場合でもすべてのデータをロードするので、そこに到達する方法は長くなります。 さらに最適化したい場合は、 'prefetch_related()'と 'values_list()'を検索することをお勧めします。 'forループ'で実行中の変数の名前を変更してください。それは同じであってはならない。 – hansTheFranz

答えて

2

@hansTheFranzは、Djangoのクエリセットは怠け者です言ったように。つまり、クエリが要求されたときにのみクエリがデータベースにヒットします。あなたのテンプレートは、結果を求めるまで

だから、それは文句を言わないのクエリを実行します。だから、あなたが使用できるはい:

blog_latest_entries = BlogDetails.objects.filter(blog_date_published__lte=date_now).order_by('-blog_date_published') 
{% for new in news|slice:":10" %} 

は、私が今まで見てきたようにSELECT * FROM Customers LIMIT 3;

関連する問題