【问题标题】:ZODB multiple object referencesZODB 多对象引用
【发布时间】:2013-10-21 02:43:30
【问题描述】:

我正在开发一个用于填写一些巨大表格的应用程序。一个表单可以属于多个项目。此外,表格有两个部分,可以多次填写,例如目标和活动,因此一个表格可以定义许多目标和活动。

我有一个代表项目的类,另一个代表表单和两个简单​​的类来代表目标和活动。 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()

我知道在存储项目时,表单列表也会被持久化,相应的目标和活动列表也来自表单。

但是在其他 OOBTrees、“表单”、“活动”和“目标”的情况下会发生什么? 我这样做是为了更容易遍历或查找单个表单/目标/活动。但我不确定 ZODB 是否会缓存这些对象,并且在保存项目时仅将它们持久化一次,并保留对该对象的引用。因此,当其中任何一个被修改时,所有引用都会更新。 这意味着当执行 db['forms']['formID'] = form 时,OOBTree 将指向与项目 OOBTree 相同的对象,因此不会保留相同的对象两次。 这是它的工作方式吗?还是会得到重复的持久对象并且都是独立的实例?

我知道有 repoze 目录来处理索引和东西,但我不需要那么多,只需能够访问表单而无需遍历项目。

谢谢!

【问题讨论】:

    标签: python zodb


    【解决方案1】:

    是的,只要您存储的目标对象在其继承中的某个位置具有子类persistent.Persistent 的类,对同一对象的任何引用都将指向完全相同的(持久)对象。正如您所描述的那样,您不应该期望重复。

    短-长-版本:ZODB 使用特殊的酸洗技术,当序列化源/引用对象时,它会看到引用是对一个持久对象,而不是再次存储该对象,它存储一个 dotted 类的元组目标对象的名称和内部 OID。

    警告:这只适用于同一个对象数据库。您的应用程序中不应有跨数据库引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多