如何通过XML文件在Odoo数据库中引入Many2one字段值?

How to introduce a Many2one field value in an Odoo database through an XML file?

我正在使用 Odoo 8,我正在尝试通过 XML 文件在数据库中引入数据。

这个文件的内容是下一个:

<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data noupdate="1">
        <record id="event_invitation_email_template" model="email.template">
            <field name="name">Event Invitation</field>
            <field name="subject">Invitation to an event</field>
            <field name="email_from">${(object.event_id.user_id.email or &apos;noreply@localhost&apos;)|safe}</field>
            <field name="email_to">${object.email|safe}</field>
        </record>
    </data>
</openerp>

效果很好。但是我想添加另一个字段model_id,它是一个Many2one(指向ir.model)。如果我要设置的值具有 XML ID,我会知道如何执行此操作,但事实并非如此。

我想将模型 my.new.model 设置为 model_id,但如果我不这样做,我不知道它在数据库中的 ID搜索。

所以我不知道如何管理我的目标。有谁能帮帮我吗?

背景:

在通过安装资源(模型、字段、模型记录、视图、记录规则、操作、菜单项等)加载数据时,Odoo 会在 'ir_model_data' table('ir.model.data' 对象),因此我们以后可以引用这些记录,甚至可以从其他模块中引用这些记录。

'ir_model_data'中的映射记录具有以下显着列:

  • 模块:模块名称,字符串文字(不是它的id)
  • 模型:完全限定的点分隔对象名称(也称为对象的技术名称)
  • res_id:资源id/Database ID(存放资源的table中记录的PK)
  • name: 记录名,字符串文字,与模块名一起唯一标识record/resource

记录名称与模块名称一起构成我们所知的资源外部 ID,其具有以下完全限定形式:'module_name.resource_name'.

在 XML 数据中定义的记录通过 'record' 标记的 'id' 属性定义它们的外部 ID。

'id' 属性可以显式包含或不包含 'module_name.'(完全限定形式)。在后一种情况(相对形式)中,假定声明资源的模块:

上面的长篇故事需要有足够的背景来回答下面的问题。

答案:

在处理任何 'record' 标签的子 'field' 标签时,'ref' 属性应具有引用的现有记录的外部 ID(完全限定或相对形式) :

在初始化时创建参考模型的映射记录modules/models/fields。由于它们缺少相应的 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')"/>