Odoo - 创建演示时从 xml 访问字段

Odoo - access to a field from xml when demo creation

我正在 Odoo 中开发一个模块。我通过委托重载了 Odoo 的 class "project.task" 表单项目模块。

py文件

class Intervention(models.Model):

     _name = "module.intervention"
     _inherits = {
         "project.task": "task_id"
     }

     ### Fields
     task_id = fields.Many2one(
         "project.task",
         ondelete="cascade",
         required=True
     )

     ### Overlord
     @api.model
     def create(self, vals)
         # do lot of thing
         intervention = super(Intervention, self).create(vals)
         # link the object with 0ne2one relation
         intervention.task_id.intervention_id = intervention

xml 文件

<record id="module.intervention0" model="module.intervention">
    <field name="type_id" ref="module.interventionTypeDirect"/>
    <field name="project_id" ref="module.project0"/>
    <field name="user_id" ref="module.user0"/>
</record>

<record id="module.activity0" model="accoanunt.alytic.line">
    <field name="unit_amount">2.5</field>
    <field name="task_id" eval="ref('module.intervention0').task_id"/>
    <field name="account_id" ref="module.project0"/>
    <field name="user_id" ref="module.user0"/>
</record>

当我尝试访问一个字段时出现以下错误

"ParseError: 'int' object has no attribute 'task_id'"

我也尝试在 eval 中使用 'env'。

<field name="task_id" eval="env['module.intervention'].browse([ref('module.intervention0')], limit=1).task_id"/>

ParseError: "name 'env' is not defined" while parsing demo.xml

我的问题是:

如何在 xml 解析期间将对象的字段访问到 eval 表达式中?

关于:制作演示数据时如何访问字段?

在 oodoo 中,我们使用 ref in xmlenv.ref in python 来引用演示数据 ID。

The syntax should be somthing like ref('module_name.xml_id')

Basically ref is an environment method returning the record matching a provided external id:

这里module_name是你模块的名称(不是型号),xml_id是id创建的演示演示数​​据

for example;

 <field name="company_id" ref="base.main_company"/>

此处我们正在访问在 base 模块中创建的演示数据 xml id main_company

希望这可以帮助您理解 odoo 中的演示数据引用。

为了解决我的问题,我使用了一个错误的模型,他为分析帐户创建了一个外部 ID。

class AffairUpdateAnalyticAccount(models.Model):

    _name = "module.affair_update_analytic_account"

    @api.model
    def create(self, vals):

        # Generate an external ID
        externalIds = self.env["ir.model.data"].search([('model', '=', 'module.affair')])
        for externalId in externalIds:
            if self.env["ir.model.data"].search_count([("name", "=", "%s_analytic_account" % externalId.name)]) == 0:
                test = self.env["ir.model.data"].create({
                    'name' : "%s_analytic_account" % externalId.name,
                    'res_id': self.env["module.affair"].browse([externalId.res_id]).project_id.analytic_account_id.id,
                    'model': "analytic.account",
                    'module' : 'module'
                })

        return super(AffairUpdateAnalyticAccount, self).create(vals)
<!-- Affair record -->

<record id="module.affairUpdateAnalyticAccount" model="module.affair_update_analytic_account">
    <field name="id">1</field>
</record>

<record id="module.activity0" model="account.analytic.line">
  <field name="unit_amount" eval="2"/>
  <field name="task_id" ref="module.intervention0_project_task"/>
  <field name="account_id" ref="module.affair0_analytic_account"/>
  <field name="user_id" ref="module.user0"/>
  <field name="is_timesheet">True</field>
</record>