了解外部标识符

来自Odoo大V社-odoo中文开发手册
110799065讨论 | 贡献2018年3月5日 (一) 15:49的版本

(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

所有数据库的记录都有一个id属性,作为数据行的唯一标识。它是由odoo数据库自动加上的序列号。然而,当加载相关数据时,这个自动标识符可能会成为一个挑战即:如果我们事先不知道将产生什么数据库id,我们如何引用相关记录呢?

Odoo的答案是外部ID。通过将我们在XML文件里面命名的外部ID作为某个数据记录记录的引用关键字来解决问题。任何其他记录数据都可以通过外部ID来引用某个数据。Odoo会把这些外部ID通过转换后得到实际数据库Id,并分配给他们实际的调用者(即找到外部标识符对应的数据表中记录行中由数据库系统自动生成的id)。


Odoo负责把外部ID转换成数据库自动生成的Id。这背后的机制比较简单:Odoo通过一个表单来管理和存储所有的映射关系,匹配的外部ID对应的数据库Id和ir.model.data模型(注:数据库模型都是由名字为ir.xxx或者ir.xxx.xxx的数据构成)。


如何查看现在有的外部标识和数据库id以及模型的映射关系呢,可以进入菜单Setting->Technical->Sequences & Identifiers->External Identifiers菜单来对外部标识进行查询(注意要进入这个菜单必须激活开发者模式)

举例:在本书已经完成的例子中,一直在围绕todo_app模块编写,那么我们进入External Identifiers菜单,在搜索栏中输入todo_app然后回车,我们可以看到搜索后的所有包含todo_app字符的外部标识符列表的页面。

ExternalID.jpg

这个页面有Complete ID列,每个Complete ID列下面的每个完整的外部标识符都是由模块名字.标识名这样的结构组成,比如todo_app.action_todo_task。


由于只有完整的外部ID必须是唯一的,模块名最终充当标识符的命名空间。这意味着相同的命名标识符可以在不同的模块中重复,并且我们不需要担心模块中的标识符与其他模块中的标识符发生冲突。


在列表的顶部,你可以看到todo_app.action_todo_task这个外部ID号。这是我们创建的模块菜单时候建立的(在相应的XML文件中定义的),也代表引用相应的菜单项。点击这个外部ID号,可以查看相应的细节:这里我们可以看到,在todo_app模块中,action_todo_task这个标识符对应了一个ir.actions.act_window模型和一个具体记录ID。 ExternalIdDetail.jpg

外部ID除了方便的提供了一种供其他模块引用的方法外,外部ID还允许在重复导入数据时避免数据重复。如果外部id已经存在,则将更新现有记录,而不是创建新记录。这就是为什么在随后的模块升级中,先前加载的记录被更新而不是被复制的原因。(典型的例子是对于界面XML的更新,每次修改界面元素后并且升级后,外部ID不会变化但是界面会更新)


上一节:第四章 模块数据
下一节:寻找外部标识符