外部标识符,也称为XML ID,是用于唯一标识 Odoo 中特定记录的有可读性的字符串标识符。在Odoo 中加载数据时它们就很重要了,这样可以对已有数据记录进行修改或在其它数据记录中引用它。不管是一些菜单、视图、动作、初始化数据,都可以看到有id这么一个字段,至于这个id是什么,下面为您解答:
比如说定义如下的初始化数据:
<record id="quality_check_report_A4" model="report.paperformat">
<field name="name">A4(库存检查)</field>
<field name="format">A4</field>
<field name="orientation">Portrait</field>
<field name="margin_top" eval="10.0"/>
<field name="margin_left" eval="7.00"/>
<field name="margin_bottom" eval="10.0"/>
<field name="margin_right" eval="7.0"/>
<field name="header_spacing" eval="10"/>
<field name="dpi" eval="90"/>
</record>
该段代码的作用是初始化了模型 report.paperformat 的一条记录,field为这条记录的各个字段,id就是这条记录的外部标识符,在odoo中的表现形式是 模块名.id 。
以上代码中的 id 与 report_paperformat 这个数据表中的id有何区别?
odoo维护了一张外部标识符与与其真实数据表的映射表——ir_model_data,所有的外部标识符是通过 ir_model_data 来存储的,例如根据以上的外部标识符在ir_model_data 查找记录:
如何根据 外部标识符 查找这条记录在report_paperformat数据表中的id?
id = self.env.ref('包名.quality_check_report_A4').id
self.env.ref('包名.quality_check_report_A4') 表示通过外部标识符获取这条记录,其实通过看数据表我们也可以得出,该条记录的数据表id为 10,如下所示:
其实这正与 ir_model_data 表中的res_id相对应.
注意:外部标识符仅需在 Odoo 模块内唯一,两个模块中使用相同标识符不会产生冲突,因为在odoo中外部标识符是以 模块名.id 的形式存在。