2016-07-28 76 views
0

我嘗試運行查詢尋呼結果,如 Model.objects.all()[start: start+page_size]Django模型查詢集切片

我也想知道是否有更多的頁面加載,這就是說,我想知道start+page_size < Model.objects.all().count().

我的問題是,如果我叫all()兩次在這裏,Django的是否執行兩次相同的查詢(一個用於切片操作[],一個用於count())。

另一個問題是,如果我在Model.objects.all()片這樣Model.objects.all()[2:9]的Django是否由蟒蛇獲取從數據庫中的所有數據和切片,或者Django的只有SQL限取limit 2 to 9

+0

btw,在Django中分頁的正確方法是https://docs.djangoproject.com/en/1.9/topics/pagination/ – Compadre

回答

3

是的,它使兩個查詢,但這些都是而不是「相同的查詢」。一個是SELECT * FROM mymodel LIMIT <page_size> OFFSET <start>,另一個是SELECT COUNT(*) FROM mymodel

如果你想避免兩個查詢,一個簡單的解決方法是,要求多一個記錄比實際需要:

Model.objects.all()[start: start+page_size+1] 

,那麼你可以遍歷高達PAGE_SIZE,並顯示下一個按鈕,如果額外記錄在那裏。

+0

謝謝Daniel。它真的是一個聰明的把戲! –

+0

如果'result = Model.objects.all()[a:a + 101]',然後對結果'sliced = result [a:a + 100]'進行切片或者使用len()'len(result)',將Django提出兩個疑問? –

+0

https://docs.djangoproject.com/en/1.9/ref/models/querysets/#when-querysets-are-evaluated – Compadre