簡體   English   中英

ZODB多個對象引用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM