gpt4 book ai didi

python - ZODB 多个对象引用

转载 作者:行者123 更新时间:2023-11-30 23:32:14 29 4
gpt4 key购买 nike

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

我有一个类来代表项目,另一个类代表表单,还有两个简单的类来代表目标和事件。项目有一个表单列表,表单有一个事件和目标列表。

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 目录来处理索引和其他内容,但我不需要那么多,只需能够访问表单而无需迭代项目。

谢谢!

最佳答案

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

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

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

关于python - ZODB 多个对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19485475/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com