背景:
在通过安装资源(模型、字段、模型记录、视图、记录规则、操作、菜单条目等)加载数据时,Odoo 会在 'ir_model_data' 表('ir.model .data' 对象),因此我们可以稍后引用这些记录,甚至可以从其他模块中引用。
'ir_model_data'中的映射记录有以下显着的列:
-
模块: 模块名称,字符串字面量(不是它的 id)
-
model:完全限定的点分隔对象名称(也称为对象的技术名称)
-
res_id:资源id/数据库ID(资源所在表中记录的PK)
-
name: 记录名称,字符串文字,与模块名称一起唯一标识记录/资源
记录名称与模块名称一起构成我们所知的资源外部 ID,它具有以下完全限定形式:'module_name.resource_name'。
在 XML 数据中定义的记录通过“记录”标签的“id”属性定义它们的外部 ID。
“id”属性可以显式包含“module_name”。 (完全限定的形式)与否。在后一种情况下(相对形式),假定声明资源的模块:
上面的长篇故事需要有足够的背景来回答后面的问题。
答案:
在处理任何“记录”标签的子“字段”标签时,“ref”属性应具有引用的现有记录的外部 ID(完全限定或相对形式):
在初始化模块/模型/字段时创建参考模型的映射记录。由于它们缺少对应的 XML 记录并且无法通过这种方式声明其对应的外部 ID,因此 ORM 根据“model_”前缀和对象的技术名称(点替换为下划线)创建其外部 ID:
这就是为什么引用模型的记录('ir.model' 记录)具有以下形式:model_XXXXX
其他一些资源的记录也有其外部 ID 的已知前缀:
模块: https://github.com/odoo/odoo/blob/8.0/openerp/modules/db.py#L90
型号: https://github.com/odoo/odoo/blob/8.0/openerp/models.py#L382
字段: https://github.com/odoo/odoo/blob/8.0/openerp/models.py#L444
SELECT * FROM "ir_model_data" WHERE name LIKE 'module_%'; -- most are 'ir.module.module' records
SELECT * FROM "ir_model_data" WHERE name LIKE 'model_%' ORDER by module, name; -- all/most are 'ir.model' records
SELECT * FROM "ir_model_data" WHERE name LIKE 'field_%' ORDER BY module, name; -- all/most are 'ir.model.fields' records
其他资源的记录可能遵循某些约定,也可能根本不遵循:
SELECT * FROM "ir_model_data" WHERE name LIKE 'view_%' ORDER by module, name; -- all/most are 'ir.ui.view' records
SELECT * FROM "ir_model_data" WHERE model LIKE 'ir.ui.view' AND name NOT LIKE 'view_%' ORDER by module, name; -- 'ir.ui.view' records with unconventional names
所以在你的情况下,你正在寻找的行是:
<field name="model_id" eval="ref('your_module.model_my_new_model')"/>