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

问题描述 投票:4回答:1

我在使用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,我就知道该怎么做了,但事实并非如此。

我想设置模型 我的新模型 作为 model_id,但我不搜索的话,不知道它在数据库中的ID。

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

xml odoo many-to-one odoo-8
1个回答
7
投票

背景是这样的

在通过安装资源(模型、字段、模型记录、视图、记录规则、动作、菜单项等)加载数据时,Odoo在'ir_model_data'表('ir.model.data'对象)中注册了所有资源的映射记录,所以我们可以在以后引用这些记录,甚至从其他模块中引用。

'ir_model_data'中的映射记录有以下几个显著的列。

  • 模块: 模块名称,字符串文字(不是它的id)
  • 模型:全限定的点分隔物体名称(也称为物体的技术名称)
  • res_id。 资源id-数据库ID(存储资源的表中记录的PK)
  • name.记录名称,是一个字符串,与模块名称一起唯一标识记录资源的文字。 记录名称,一个字符串,与模块名称一起唯一标识记录资源。

记录名与模块名一起构成了我们熟知的资源外部ID,它有以下完全限定的形式。'module_name.resource_name'.

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

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

上面的长篇小说是要求有足够的背景,才会有下面的答案。

回答:在处理任何'record'标签的子'字段'标签时,'ref'属性应该具有引用现有记录的外部ID(外部ID)。

在处理任何'record'标签的子'字段'标签时,'ref'属性要有被引用的现有记录的External ID(完全限定或相对形式)。

引用模型的映射记录是在初始化模块modelsfields时创建的,由于它们缺乏相应的XML记录,不能通过这种方式声明相应的外部ID,因此ORM根据'model_'前缀和对象的技术名称(用下划线代替点)创建其外部ID。由于它们缺乏相应的XML记录,并且不能通过这种方式声明其相应的外部ID,ORM根据'model_'前缀和对象的技术名称(点用下划线代替)创建其外部ID。

这就是为什么引用模型的记录('ir.model'记录)有如下形式:model_XXXXX

其他一些资源的记录也有已知的前缀作为其外部ID。

模块。 https:/github.comodooodooblob8.0openerpmodulesdb.py#L90。

模型。 https:/github.comodooodooblob8.0openerpmodels.py#L382。

字段。 https:/github.comodooodooblob8.0openerpmodels.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')"/>
© www.soinside.com 2019 - 2024. All rights reserved.