2012-11-04 75 views
1

在Django的Django的分頁,我使用分頁程序如下所示:沒有整個查詢集

從django.core.paginator進口分頁程序,EmptyPage,PageNotAnInteger

def myView(request): 
    ... 
    paginator = Paginator(Annonce.objects.filter(name="huhu"), 10) 
    paginator._count = s.count() 
    try: 
     annonces = paginator.page(page) 
    except PageNotAnInteger: 
     annonces = paginator.page(1) 
    except EmptyPage: 
     annonces = paginator.page(paginator.num_pages) 

在s.search()函數我在我的postgres數據庫上查詢。

事實證明,即使我每頁顯示10項,查詢不受限制。

我試圖限制查詢與Annonce.objects.filter(name="huhu")[:10]和指定我自己的計數。但是,如果我這樣做,則分銷商不起作用。

有沒有辦法來優化呢?

+0

你把什麼放在你的上下文中?你在迭代什麼? –

回答

10

使用此示例https://docs.djangoproject.com/en/dev/topics/pagination/#using-paginator-in-a-view作爲編寫使用django Paginator的視圖函數的指南。

注意,在示例代碼snippert -

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

    page = request.GET.get('page') # <--- This is the key to your solution. 

contact_list是未實際上尚未評價所分配的​​查詢集。指派給Paginator instancepaginator = Paginator(contact_list, 25)是懶惰的,直到需要時才真正執行。

page = request.GET.get('page')從您的網址獲取您的額外GET變量?page=2(作爲示例)。該URL實際上看起來像http://localhost:8000/my/listing?page=2,當我們試圖找回應該出現在您的房源頁面上的25個對象,第2頁。

這是你的數據庫中的實際查詢被執行: -

try: 
    contacts = paginator.page(page) 
except PageNotAnInteger: 
    # If page is not an integer, deliver first page. 
    contacts = paginator.page(1) 

contacts = paginator.page(page)對數據庫執行查詢基於給定的頁碼以及每頁需要「25」對象的條件僅檢索有限的一組對象。

+0

其實你是對的。我的設計直接遵循你所描述的設計。唯一的區別讓我想到在構建paginator時評估的結果是我使用緩存系統來獲得結果。這是在構建分頁器時強制進行評估的結果。 – EagleOne

+0

此示例不能解決問題,並且仍會調用COUNT()查詢。調用[Paginator.page(n)](https://docs.djangoproject.com/en/1.11/_modules/django/core/paginator/#Paginator.page)會調用'Paginator.validate_number()',它會調用' Paginator.num_pages()'這將調用'count()',它仍然會調用數據庫的總COUNT()。 –