Django筆記:取得物件在Queryset中的索引
September 22, 2009 10:06 pm今天在實作使用者界面的時候遇到了一個效能上的問題:在取得queryset中的目標物件後,打算在template留下前一個物件跟後一個物件的連結,這時候就需要前後的index或id。由於id並不是以固定的值在遞增或遞減,所以必須把前後的id在render的時候一併傳進template之中,也就是id需要在對應的view先計算好。
由於Queryset是動態產生的資料集合,所以不提供index()這樣的API。最接近的做法是利用Django的queryset API中的list(),將queryset強制轉成list,如此一來就有索引值可以使用了。但是很明顯的這樣非常浪費運算資源,官方文件也提到:
Be warned, though, that this could have a large memory overhead, because Django will load each element of the list into memory. In contrast, iterating over a QuerySet will take advantage of your database to load data and instantiate objects only as you need them.
另一個比較沒那麼耗資源的做法是使用loop或iterator做傻瓜比對法,不過當資料量大的時候這種做法看起來還蠻傻的,也就是越到後面的物件就要掃越久。今天我是暫時用這個方法解決……
剛剛在google找相關解法,目前看來比較好的做法是用其他的條件去縮小queryset,比方說在我的例子就可以用頁碼去縮小搜尋範圍,之後我想用方法一或二都可以減輕負擔。
>> qs=Data.objects().filter(keyword=’xxx’)
>> for data in qs[page*page_item_num : (page+1)*page_item_num]
>> ….if data.id=target.id: break
同樣的也可以只轉有限數量的queryset成為list,不過我覺得還是不要這樣做比較好。
9/23:
剛到公司把程式拿出來看,發現我並沒有傳遞頁碼啊啊啊啊~
Categories: 工作


3 個回應 to “Django筆記:取得物件在Queryset中的索引”
另外建一個 relationship 來管前後關聯?
Jye,
可以的話暫時不想動到raw SQL
因為我還沒玩到那裡,而且我不想再碰資料庫了…XD
哈哈~ 有一天你會連電腦都不想碰 XD
要留言乎?