2011-08-15 52 views
3

我優化這條線的內存負載(〜2GB,離線記賬和分析例程):Django的對象...值()只選擇某些領域

l2 = Photograph.objects.filter(**(movie.get_selectors())).values() 

有沒有辦法說服Django的在獲取values()時跳過某些列?

具體來說,例程會獲得滿足特定條件的表的所有行(db已經過優化並且執行得非常快),但是對於python來說處理有點太多 - 每行都有一個長字符串被引用,存儲縮略圖的網址。

我只需要從每一行中真正需要三個字段,但是,如果包含所有字段,它會突然消耗大約5kB /行,令人不快地將RAM推到極限。

回答

16

values(*fields)函數允許你指定你想要的字段。

5

查看QuerySet方法,only。當您聲明only想要立即加載某些字段時,QuerySet管理器將不會拉入對象中的其他字段,直到您嘗試訪問它們。

如果你必須處理ForeignKeys,那也必須預取,則還檢查了select_related

以上Django文檔的兩個環節有很好的例子,應該明確自己使用。


採取在Django Debug Toolbar它帶有一個debugsqlshell管理命令,可以讓你看到正在生成的SQL查詢,使用拍攝時間,做爲你與你的模型上一個Django/Python的外殼玩一下。