2012-05-09 62 views
0

蔭試圖在我的網頁使用分頁每頁僅有10項。所以我在django文檔 here中找到了一個例子。如何以檢索在Django

from django.core.paginator import Paginator, InvalidPage, EmptyPage 

def listing(request): 
    contact_list = Contacts.objects.all() 
    paginator = Paginator(contact_list, 25) # Show 25 contacts per page 

    # Make sure page request is an int. If not, deliver first page. 
    try: 
     page = int(request.GET.get('page', '1')) 
    except ValueError: 
     page = 1 

    # If page request (9999) is out of range, deliver last page of results. 
    try: 
     contacts = paginator.page(page) 
    except (EmptyPage, InvalidPage): 
     contacts = paginator.page(paginator.num_pages) 

    return render_to_response('list.html', {"contacts": contacts}) 

這個例子中的問題是他一次加載所有項目到分頁。但在我的數據庫中有20000條目,並且它們都不能一次加載。那麼,有沒有一種方法來優化查詢?

+1

你確定它一次加載所有的項目嗎?查詢集()是懶惰:https://docs.djangoproject.com/en/1.4/topics/db/queries/#querysets-are-lazy – monkut

+0

我是這麼認爲的它用來加載速度更快,當有'在1000'我的條目數據庫。現在當項目大小增加到'20000'時,它的加載非常緩慢。 –

+0

您是否嘗試過交互式shell?嘗試一點一點地執行你的代碼(記住不要輸入「contact_list」,因爲這會加載查詢集中的所有項目)。你可能會看到究竟哪個部分需要這麼長時間。祝你好運! –

回答

2

如果它加載的所有對象到內存中一次,那麼它是一個錯誤。只要你不把它們送入Paginator之前明確地投你QuerySet s到列表中,分頁程序只使用取回一個查詢匹配QuerySet的行數,然後適當地限制了QuerySet只取那些要顯示的行。

如果你真的懷疑它加載的所有對象,以驗證這一點,使用django-debug-toolbar,並期待在執行查詢。如果它確實加載了所有內容,那麼請在Django的trac中提交一個錯誤。

1

設置DEBUGFalse settings.py中,這將大大提高你的表現。調試模式(除其他外)打開SQL緩存,這可能會顯着減慢速度。