2017-08-24 40 views
2

我有一個顯示分頁搜索結果的Django應用程序。每個頁面顯示20個結果,我在底部有一個分頁欄,顯示比當前頁面小5頁(比如Google)的5頁。問題是,對於分頁欄,我調用count()來獲取結果總數,以便知道當前頁面之前是否有5頁結果。Django:替代計數()

問題是更普遍的查詢可能需要大約10秒來執行count()。我實際上並不關心確切的數字,因爲我的大多數用戶可能永遠無法達到結果的結尾。有什麼方法可以估計count的輸出,或者更一般地說,估計查詢返回結果的數量?

這是目前我的查詢來獲得實際結果。

results = Item.objects.filter(title__icontains=query).order_by('views')[offset:limit] 

offsetlimit變量指的是在當前頁上所示的結果的段。我能看到解決我的問題的唯一方法是提前5頁的結果段並檢查它是否爲空。然而,該解決方案有很多邊緣案例,如果有更簡單的解決方案,我真的不想花一天時間編寫代碼。

+0

你可以使用EXPLAIN它會返回估計qeury需要檢查的行數。 –

+0

@Raymond Nijland你能提供一個例子嗎?有沒有辦法通過django使用EXPLAIN,或者我必須編寫自己的原始sql? – Sam

回答

0

也不是理想的解決方案,但可能值得測試您的特定情況。您可能會引入一個超時功能,使查詢的幫助下:

http://code.activestate.com/recipes/576780/

...或類似的解決方案。你要麼需要確切的行數,要麼需要很多信息。這需要一些基準來獲得正確的判斷,並且仍然容易受到某些外部因素的影響,但是在99.9%的情況下也可以正常工作。

此外,它減少了對數據庫的長查詢負載。