ZODB多对象引用

2024-05-14 13:31:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我有一个类代表项目,另一个为形式,两个简单的类代表目标和活动。项目有一个表单列表,表单有一个活动和目标列表。在

class Project(persistent.Persistent):
    forms = PersistentList() 
    ...

class Form(persistent.Persistent):
    objectives = PersistentList() 
    activities = PersistentList() 
    ...

我的问题是,我计划这样在ZODB中存储这些数据:

^{pr2}$

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

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

我知道有respose catalog来处理索引和其他东西,但我不需要那么多,只需要能够访问表单而不必迭代项目。在

谢谢!在


Tags: 项目对象表单目标列表代表forms形式
1条回答
网友
1楼 · 发布于 2024-05-14 13:31:41

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

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

注意:这只适用于同一个对象数据库。应用程序中不应该有跨数据库引用。在

相关问题 更多 >

    热门问题