我正在开发一个应用程序,它用来填写一些巨大的表格。表单可以属于几个项目。此外,表单有两个部分a,可以多次填写,比如目标和活动,因此表单可以定义许多目标和活动。
我有一个类来表示项目,另一个类表示表单,两个简单类来表示目标和活动。项目有一个表单列表,表单有一个活动和目标列表。
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‘= form时,OOBTree将指向与项目OOBTree相同的对象,因此不会将同一个对象持久化两次。它就是这样运作的吗?或者我会复制持久化对象,这些对象都是独立的实例吗?
我知道有重新配置目录来处理索引和其他东西,但是我不需要那么多,只需要能够访问一个表单,而不需要迭代项目。
谢谢!
发布于 2013-10-21 04:39:53
是的,只要要存储的目标对象在继承中的某个地方有子类persistent.Persistent的类,对同一对象的任何引用都会指向完全相同的(持久)对象。您不应该期望重复,因为您已经描述了这一点。
短长版本: ZODB使用特殊的酸洗技术,在序列化源/引用对象时,它看到引用是对持久对象的引用,而不是再次存储该对象,它存储类虚名的元组和目标对象的内部OID。
警告:这只在同一个对象数据库中起作用。应用程序中不应该有跨数据库引用。
https://stackoverflow.com/questions/19485475
复制相似问题