了解外部标识符

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

跳转至: 导航搜索

所有数据库的记录都有一个id属性,作为数据行的唯一标识。

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

Odoo的答案是外部标识符。外部标识符通过将我们命名的标识符分配给要加载的数据记录来解决这个问题。任何其他记录数 据都可以使用命名标识符来引用它。Odoo会把这些标识符名称分配给他们实际的数据记录的Id(即找到外部标识符对应的数据表中记录行中由数据库系统自动生成的id)。


Odoo則負責將外部ID名稱轉換為實際資料庫分配給它們的ID。這背後的機制很簡單:Odoo管理一個表單其內容儲存所

匹配的外部IDs與對應的數字數據庫ID:ir.model.data模型。


如何查看现在有的外部标识和数据库id以及模型的映射关系呢,可以进入菜单Setting->Technical->Sequences & Identifiers->External Identifiers菜单来对外部标识进行查询

(注意要进入这个菜单必须激活开发者模式)

举例:在本书已经完成的例子中,一直在围绕todo_app模块编写,那么我们进入External Identifiers菜单,在搜索栏中输入todo_app然后回车

我们可以看到搜索后的所有包含todo_app字符的外部标识符列表的页面,这个页面有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。

补充图


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


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