2017-10-18 1 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

사용하는 것보다 동일합니다. – Deadpool

+0

같은. Django Debug Toolbar를 사용하십시오, Luke! –

+3

보기에서 qs를 제한하십시오. SQL 문은 두 경우 모두에서 실행되지만 제한된 SQL 문은 더 빠르며 그리 무겁지 않습니다. 템플릿의 q를 자르면 같은 출력이되지만 처음 세 요소가 필요할 때에도 모든 데이터를로드하므로 오래 걸릴 수 있습니다. 더 많은 최적화를하고 싶다면'prefetch_related()'와'values_list()'를 찾아보기를 권합니다. 그리고'for loop'에서 실행중인 변수의 이름을 바꾸십시오. 그것은 동일해서는 안됩니다. – hansTheFranz

답변

2

@hansTheFranz는 Django querysets이 게으른다고 말했다. 이는 쿼리가 요청할 때만 쿼리가 데이터베이스에 도달한다는 의미입니다.

템플릿이 결과를 요구할 때까지는 쿼리가 실행되지 않습니다. 그래서, 그래 당신은 사용할 수 있습니다 : I가 본 지금,`slice` 목록 요소를 제한하기 위해 가장 좋은 방법입니다하기로

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;