2012-01-19 3 views
4

PersistentList 속성이 여러 개있는 객체를로드 할 경우 목록이 자동으로 전체적으로로드됩니까? 또는 ZODB는로드 할 요소의 요소에 액세스 할 때까지 대기합니까? 후자의 경우 요소에 액세스 할 때마다 전체 목록을로드하거나 목록의 일부만로드합니까?ZODB PersistentLists가 지연로드 되었습니까?

+2

PersistentList 컨텐트 항목은 인덱스에 의해 액세스 될 때로드됩니다. 일반 Python 목록은 ZODB에서 전체적으로 절름발이입니다. –

+0

Mikko :이 질문에 대답 할 것입니다. – jsbueno

+0

글쎄, 그것보다 조금 복잡해. PersistentList 자체는 지연로드가 아니지만 ZODB *는 *이며, 레코드가 Persistent에서 상속받은 경우입니다. 내 대답을 보라. –

답변

4

내부에 나열된 목록은 모두 persistent.Persistent에서 상속되며, 요청시로드됩니다.

그러나 Persistent에서 상속되지 않는 기본 유형 및 클래스는 PersistentList 인스턴스와 함께 메모리로로드됩니다.

PersistentList는 기본적으로 변경되었을 때 self._p_changed을 설정하는 UserList (및 Persistent)의 하위 클래스이므로 목록의 변경 사항이 해당 레코드의 ZODB 커밋으로 변환됩니다.

+1

게으른로드는 Persistent 오브젝트가 아닌 Persistent 오브젝트에 대한 참조의 동작임을 강조하는 것이 중요하다고 생각합니다. Persistent 객체에 대한 참조와 Persistent 객체의 객체 그래프를 사용하여 std python 목록으로 지연로드를 얻을 수도 있습니다. –