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

来自Odoo大V社-odoo中文开发手册
跳转至: 导航搜索
第1行: 第1行:
:外部ID(也稱為XML ID)是人類可讀的字串標識符,其唯一標示Odoo中特定的記錄。這在將數據加載到Odoo時很重要。
+
 
:一個原因是當升級模組時,其資料文件將被再次加載至資料庫,並且我們需要檢測已經存在的記錄,
+
所有数据库的记录都有一个id属性,作为数据行的唯一标识。
是為了更新紀錄而不是創建新的重複的記錄。
+
 
:另一個原因是為了支援互相關聯的資料:數據記錄必須能夠與其他數據記錄關聯。實際的資料庫ID是在模組安裝期間
+
它是由odoo数据库自动加上的序列号。然而,当加载相关数据时,这个自动标识符可能会成为一个挑战即:如果我们
由資料庫自動分配的具有順序的編號。而外部ID提供了一種引用相關記錄的方法但不需要事先知道資料庫將被分配給其
+
事先不知道将产生什么数据库id,我们如何引用相关记录呢?
紀錄的ID,允許我們定義Odoo數據文件中的資料關係。
+
 
 +
Odoo的答案是外部标识符。外部标识符通过将我们命名的标识符分配给要加载的数据记录来解决这个问题。任何其他记录数
 +
据都可以使用命名标识符来引用它。Odoo会把这些标识符名称分配给他们实际的数据记录的Id(即找到外部标识符对应的数据表中记录行中由数据库系统自动生成的id)。
 +
 
 +
 
 
:Odoo則負責將外部ID名稱轉換為實際資料庫分配給它們的ID。這背後的機制很簡單:Odoo管理一個表單其內容儲存所
 
:Odoo則負責將外部ID名稱轉換為實際資料庫分配給它們的ID。這背後的機制很簡單:Odoo管理一個表單其內容儲存所
 
匹配的外部IDs與對應的數字數據庫ID:ir.model.data模型。
 
匹配的外部IDs與對應的數字數據庫ID:ir.model.data模型。
:要檢查現有映射匹配,請轉到設置上方的技術部分的目錄並選擇“序列與身份標識”下的“外部標識符”目錄項。
 
:例如,如果我們看外部IDs列表,並透過todo_app模組過濾它們,我們會看到模組創建前所生成的外部IDs:
 
 
  
:我們可以看到外部標識符有一個完整的ID標籤。注意它是運用點( . )去連接模組名稱及其標識符名稱而組成例如:
+
 
todo_app.action_todo_task。
+
如何查看现在有的外部标识和数据库id以及模型的映射关系呢,可以进入菜单Setting->Technical->Sequences & Identifiers->External Identifiers菜单来对外部标识进行查询
:外部標識符只在Odoo模塊內部是唯一的,若兩個模組意外地選擇了相同標識符名稱是沒有衝突的風險。要構建一個通用
+
 
的唯一ID,Odoo結合模塊名稱與實際外部標識符名稱。你可以在Complete(通用) ID欄位中看到。
+
(注意要进入这个菜单必须激活开发者模式)
:在資料文件中使用外部ID時,可以選擇要使用完整ID或只是外部ID名稱。通常使用外部ID名稱較為簡單,但是完整ID使
+
 
我們能夠參考來自其他模塊的數據記錄。當要這樣做時,請確保那些模組包含在模組依賴項中,以確保這些記錄在先前即
+
举例:在本书已经完成的例子中,一直在围绕todo_app模块编写,那么我们进入External Identifiers菜单,在搜索栏中输入todo_app然后回车
加載。
+
 
:在列表的上方,我們有todo_app.action_todo_task的通用ID。這是我們為模組創建的目錄操作,其關聯到相應的目錄
+
我们可以看到搜索后的所有包含todo_app字符的外部标识符列表的页面,这个页面有Complete ID列,每个Complete ID列下面的每个完整的外部标识符都是由
項中。通過點擊它,我們去表單查看詳細資料在todo_app模塊中action_todo_task的外部ID映射到一個
+
 
ir.actions.act_window模型中特定的記錄ID--72。
+
模块名字.标识名这样的结构组成,比如todo_app.action_todo_task。
+
 
:此外提供一種方便地引用其他記錄的方法,外部ID還允許您避免重複導入數據時造成資料重複。如果外部ID已經存在,
+
 
現有記錄將被更新;你不需要創建新記錄。這就是為什麼在後續模塊升級,先前加載的記錄被更新而不是被複製。
+
由于只有完整的ID必须是唯一的,模块名最终充当标识符的命名空间。这意味着相同的命名标识符可以在不同的模块中重复,并且我们不需要担心模块中的标识符与其他模块中的标识符发生冲突。
 +
 
 +
 
 +
在列表的顶部,你可以看到todo_app.action_todo_task这个ID号。这是我们创建的模块菜单时候建立的(在相应的XML文件中定义的),也代表引用相应的菜单项。点击这个ID号,可以查看相应的细节:这里我们可以看到,在todo_app模块中,action_todo_task这个标识符对应了一个ir.actions.act_window模型和一个具体记录ID。
 +
 
 +
补充图
 +
 
 +
 
 +
 
 +
外部ID除了方便的提供了一种供其他模块引用的方法外,外部ID还允许在重复导入数据时避免数据重复。如果外部id已经存在,则将更新现有记录,而不是创建新记录。这就是为什么在随后的模块升级中,先前加载的记录被更新而不是被复制的原因。(典型的例子是对于界面XML的更新,每次修改界面元素后并且升级后,外部ID不会变化但是界面会更新)
 +
 
 +
 
 
  上一节:[[第四章 模块数据]]
 
  上一节:[[第四章 模块数据]]
 
  下一节:[[寻找外部标识符]]
 
  下一节:[[寻找外部标识符]]

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


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