我正在开发一个用于填写一些巨大表格的应用程序。一个表单可以属于多个项目。此外,表格有两个部分,可以多次填写,例如目标和活动,因此表格可以定义许多目标和活动。
我有一个代表项目的类,另一个代表表单和两个简单的类来代表目标和活动。Project 有一个表单列表,Form 有一个活动和目标列表。
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()
我知道在存储项目时,表单列表也会被持久化,并且表单中相应的目标和活动列表也会被保留。
但是在其他 OOBTree、“形式”、“活动”和“目标”的情况下会发生什么?我这样做是为了更容易遍历或查找单个表单/目标/活动。但我不确定 ZODB 是否会缓存这些对象,并且在保存项目时只将它们持久化一次,并保留对该对象的引用。因此,当其中任何一个被修改时,所有引用都会更新。这意味着在执行db['forms']['formID'] = form 时,OOBTree 将指向与项目 OOBTree 相同的对象,因此不会将同一对象保留两次。这是它的工作方式吗?还是会得到重复的持久对象并且都是独立的实例?
我知道有 repoze 目录来处理索引和东西,但我不需要那么多,只需能够访问表单而无需遍历项目。
谢谢!