使用来自另一个模块的 eval 访问 odoo 字段

Accessing odoo fields using eval from another module

有人可以帮助我理解这一行的目的吗? 我可以看到它指的是帐户中的一个字段,然后是模型 account_move,然后是字段 amount_total.

我正在尝试将此模块从 v12 移植到 v13,但出现 amount_total 不存在的错误。 字段 amount_total 存在于该模型中

<field name="ks_record_field" eval="ref('account.field_account_move__amount_total')" />

我移植的模块中原来的字段是这样的

<field name="ks_record_field" eval="ref('account.field_account_invoice__amount_total')" />

根据数据文件字段documentation :

If a ref attribute is provided, its value must be a valid external id, which will be looked up and set as the field’s value.
Mostly for Many2one and Reference fields.

The eval attributes simply evaluates whatever Python expression it is provided and sets the result as the field’s value.
The evaluation context contains various modules (time, datetime, timedelta, relativedelta), a function to resolve external identifiers (ref) and the model object for the current field if applicable (obj).

当数据文件被执行时,Odoo 将尝试计算由 eval 属性指定的表达式并调用 xmlid_lookup,这将 return (id, res_model, res_id) 或如果找不到则提高 ValueError

Total 字段外部标识符不存在于数据库中(未创建或删除)或已被修改。

除了@Kenly 的回答,odoo 中模型和字段的信息都存储在数据库中,当 odoo 保存它们时,它们有一个特殊的 XML-ID 结构,您可以使用它来快速检索它们。

  • model: prefix model_ 与模型名称连接,用下划线替换点

     my.model.name --------->  model_my_model_name
    

您可以查看ir.model.access.csv我们一直在使用它。

  • 字段:前缀 field_ name of the model + underscore + name of the field

    连接
      my_field_name ----->  field_my_model_name_my_field_name
    

当然,当您引用在另一个应用程序中创建的模型时,您需要像 account.field_account_invoice__amount_total 一样提供完整的 XML-id,因为 account.invoice 是在 account 模块在旧版本的 Odoo 中,你会收到此错误,因为在 V13 模型中 account.invoice 被合并到 account.move ref 将在数据库中查找字段,但它不会找到因为已经没有这样的模型了

希望对你也有帮助。