2012-01-19 191 views
4

如果我加載一個具有多個PersistentList屬性的對象 - 列表是否自動加載完整列表?或者,ZODB是否等到我訪問列表中的某個元素才能加載它?如果是後者,是否每次訪問元素時加載整個列表,還是隻加載列表的一部分?是ZODB PersistentLists懶惰加載?

+2

PersistentList內容項在按索引訪問時加載。正常的Python列表在ZODB中作爲一個整體被醃製。 –

+0

Mikko:這會回答這個問題 - 你是否在意添加,作爲回答而不是評論? – jsbueno

+0

呃,比這更復雜一點; PersistentList本身不是延遲加載,但ZODB *是*,前提是記錄從Persistent繼承。看到我的答案。 –

回答

4

提供了您的元素裏面的該列表本身繼承自persistent.Persistent,它們將按需加載。

但是,不從Persistent繼承的原始類型和類與PersistentList實例一起加載到內存中。

PersistentList基本上是UserList(和Persistent)的子類,它在更改時設置self._p_changed,以便對列表的更改轉換爲ZODB提交以進行記錄。

+1

我認爲重要的是強調延遲加載是對持久對象的引用的行爲,而不是PersistentList的行爲。您還可以使用持久對象引用的std python列表以及Persistent對象的對象圖進行延遲加載。 –