“了解外部标识符”的版本间的差异

来自Odoo大V社-odoo中文开发手册
跳转至: 导航搜索
 
(未显示3个用户的7个中间版本)
第1行: 第1行:
::外部ID(也稱為XML ID)是人類可讀的字串標識符,其唯一標示Odoo中特定的記錄。這在將數據加載到Odoo時很重要。
 
::一個原因是當升級模組時,其資料文件將被再次加載至資料庫,並且我們需要檢測已經存在的記錄,是為了更新紀錄而不是創建新的重複的記錄。
 
::另一個原因是為了支援互相關聯的資料:數據記錄必須能夠與其他數據記錄關聯。實際的資料庫ID是在模組安裝期間由資料庫自動分配的具有順序的編號。而外部ID提供了一種引用相關記錄的方法但不需要事先知道資料庫將被分配給其紀錄的ID,允許我們定義Odoo數據文件中的資料關係。
 
::Odoo則負責將外部ID名稱轉換為實際資料庫分配給它們的ID。這背後的機制很簡單:Odoo管理一個表單其內容儲存所匹配的外部IDs與對應的數字數據庫ID:ir.model.data模型。
 
::要檢查現有映射匹配,請轉到設置上方的技術部分的目錄並選擇“序列與身份標識”下的“外部標識符”目錄項。
 
::例如,如果我們看外部IDs列表,並透過todo_app模組過濾它們,我們會看到模組創建前所生成的外部IDs:
 
 
  
::我們可以看到外部標識符有一個完整的ID標籤。注意它是運用點( . )去連接模組名稱及其標識符名稱而組成例如:todo_app.action_todo_task。
+
所有数据库的记录都有一个id属性,作为数据行的唯一标识。它是由odoo数据库自动加上的序列号。然而,当加载相关数据时,这个自动标识符可能会成为一个挑战即:如果我们事先不知道将产生什么数据库id,我们如何引用相关记录呢?
::外部標識符只在Odoo模塊內部是唯一的,若兩個模組意外地選擇了相同標識符名稱是沒有衝突的風險。要構建一個通用的唯一ID,Odoo結合模塊名稱與實際外部標識符名稱。你可以在Complete(通用) ID欄位中看到。
+
 
::在資料文件中使用外部ID時,可以選擇要使用完整ID或只是外部ID名稱。通常使用外部ID名稱較為簡單,但是完整ID使我們能夠參考來自其他模塊的數據記錄。當要這樣做時,請確保那些模組包含在模組依賴項中,以確保這些記錄在先前即加載。
+
Odoo的答案是外部ID。通过将我们在XML文件里面命名的外部ID作为某个数据记录记录的引用关键字来解决问题。任何其他记录数据都可以通过外部ID来引用某个数据。Odoo会把这些外部ID通过转换后得到实际数据库Id,并分配给他们实际的调用者(即找到外部标识符对应的数据表中记录行中由数据库系统自动生成的id)。
::在列表的上方,我們有todo_app.action_todo_task的通用ID。這是我們為模組創建的目錄操作,其關聯到相應的目錄項中。通過點擊它,我們去表單查看詳細資料在todo_app模塊中action_todo_task的外部ID映射到一個ir.actions.act_window模型中特定的記錄ID--72。
+
 
   
+
 
::此外提供一種方便地引用其他記錄的方法,外部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不会变化但是界面会更新)
 +
 
 +
 
 +
  上一节:[[第四章 模块数据]]
 +
下一节:[[寻找外部标识符]]

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不会变化但是界面会更新)


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