[英]ZODB multiple object references
即時開發一個應用程序,它用於填充一些巨大的形式。 表單可以屬於多個項目。 此外,表單還有兩個部分,可以多次填寫,如目標和活動,因此表單可以定義許多目標和活動。
我有一個代表項目的類,另一個代表表單和兩個簡單的類來表示目標和活動。 項目有一個表單列表,表單有一個活動和目標列表。
class Project(persistent.Persistent):
forms = PersistentList()
...
class Form(persistent.Persistent):
objectives = PersistentList()
activities = PersistentList()
...
我的問題是,我計划將這些數據存儲在ZODB中,如下所示:
db['projects'] = OOBTree()
db['forms'] = OOBTree()
db['activities'] = OOBTree()
db['objectives'] = OOBTree()
project = Project(...)//fill data with some parameters
form = Form(...)//fill data with some parameters
objective1 = Objective(...)
objective2 = Objective(...)
activity1 = Activitiy(...)
activity2 = Activitiy(...)
form.addObjective(objective1)
form.addObjective(objective2)
form.addActivity(activity1)
form.addActivity(activity2)
project.addForm(form)
db['projects']['projectID'] = project
db['forms']['formID'] = form
db['activities']['activityID'] = activity1
db['activities']['activityID'] = activity2
db['objectives']['objectiveID'] = objective1
db['objectives']['objectiveID'] = ojective2
transaction.commit()
我知道在存儲項目時,表單列表也會被持久化,並且表單中的目標和活動的相應列表也是如此。
但是在其他OOBTrees,“形式”,“活動”和“目標”的情況下會發生什么? 我這樣做是為了更容易遍歷或尋找個人形式/目標/活動。 但我不確定ZODB是否會緩存這些對象,並且只在保存項目時保留它們一次,並保留對該對象的引用。 因此,當修改其中任何一個時,所有引用都會更新。 這意味着當執行db ['forms'] ['formID'] = form時 ,OOBTree將指向與項目OOBTree相同的對象,因此不會將同一對象持久兩次。 這是它的工作方式嗎? 或生病得到重復的持久化對象,都將是獨立的實例?
我知道theres repoze目錄來處理索引和東西,但我不需要那么多,只需能夠訪問一個表單而不必迭代項目。
謝謝!
是的,只要您正在存儲的目標對象具有在其繼承中的某個子類persistent.Persistent
類。對同一對象的任何引用都將指向完全相同(持久)的對象。 你不應該像你所描述的那樣期望重復。
short-long-version:ZODB使用特殊的pickle技術,在序列化源/引用對象時,它看到引用是一個持久對象,而不是再次存儲該對象,它存儲了一個類點名稱的元組和目標對象的內部OID。
警告:這只適用於同一個對象數據庫。 您的應用程序中不應該有跨數據庫引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.