2012-06-13 60 views
1

我有Django的一個通用的列表視圖返回大約300個對象(除非在執行搜索)。只處理子集(並返回原​​來的查詢集)

我有分頁集合僅將對象的顯示器10。

所以我查詢數據庫,然後通過迭代的對象,他們的處理和顯示前增加額外的價值。我注意到所有300個對象都完成了處理,並且分頁在處理完成後完成。所以我只想對要顯示的對象進行處理以提高性能。

我計算所述查詢集的對象應當被處理0-10爲第1頁,11-20 2頁,21-30 3頁等

現在我要處理的索引只顯示範圍內的對象,但返回完整的查詢集(所以genreic視圖按預期工作)。

起初我想:

for object in queryset[slice_start:slice_end] : 
    # process things here 

return queryset 

但切片彷彿回到一個新的查詢集,和原來的查詢集對象不具有任何的計算值。

目前我的解決辦法是:

index = -1 
for object in queryset: 
    index += 1 
    if index < slice_start or index > slice_end : continue 
    # process things here 
return queryset 

現在這個工作,但它似乎相當哈克,並unelegant爲Python。 有沒有更pythonic的方式來做到這一點?

+0

您是否使用Django的分頁程序類? –

回答

2

如果你使用Django的Paginator類(docs),那麼你可以請求當前頁面,並遍歷視圖中的那些對象:

from django.core.paginator import Paginator 

# in the view: 
p = Paginator(objects, 2) 
page = p.page(current_page) 
for o in page.object_list: 
    # do processing 
    pass 

您可以獲取價值current_page從請求的參數(例如,page參數在request.GET)。

+0

如何從通用視圖中獲取paginator對象?我打開了分頁,所以我認爲沒有必要創建另一個分頁。 –

1

您應該對page.object_list的結果進行處理,這將保證只包含該頁面的對象。