【问题标题】:How to introduce a Many2one field value in an Odoo database through an XML file?如何通过 XML 文件在 Odoo 数据库中引入 Many2one 字段值?
【发布时间】:2015-10-06 11:21:13
【问题描述】:

我正在使用 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。

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

【问题讨论】:

    标签: xml odoo many-to-one odoo-8


    【解决方案1】:

    背景:

    在通过安装资源(模型、字段、模型记录、视图、记录规则、操作、菜单条目等)加载数据时,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')"/>
    

    【讨论】:

    • 这是一个很好的答案@Jainik!我只是要编辑它以添加我必须编写的代码行来管理我的目的。
    • 噢...如果我能在网上找到的所有 odoo 资源都如此总部,我会非常高兴。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多