如何通过XML为Odoo中account.account的Many2many字段添加记录?
解决Odoo中Many2many字段关联已有记录失败的问题
问题分析
你尝试通过XML数据为Odoo自带的l10n_qa.1_bank_template记录关联coa.field.mapping记录,但两种方法均未生效,核心原因可能是模块加载顺序错误、Many2many命令使用不当或外部ID引用问题。
解决方案步骤
1. 确保模块加载顺序正确
Odoo中模块按依赖顺序加载,如果你的模块在l10n_qa之前加载,对l10n_qa.1_bank_template的更新会被原模块的数据覆盖。
修改模块的__manifest__.py,将l10n_qa加入依赖列表:
'depends': ['base', 'account', 'l10n_qa'],
2. 使用正确的Many2many更新命令
追加已有记录(推荐)
如果只想给目标记录新增关联、不覆盖原有内容,使用(4, record_id, 0)命令,该命令会将指定ID的记录追加到Many2many字段中:
<record model="account.account" id="l10n_qa.1_bank_template"> <field name="existing_coa_fields_ids" eval="[(4, ref('mof.coa_field_a_10rf_annual_rev'), 0)]"/> </record>
替换所有关联记录
如果需要清空原有关联并设置新内容,使用(6, 0, [record_ids])命令,注意此操作会删除该字段原有的所有关联:
<record model="account.account" id="l10n_qa.1_bank_template"> <field name="existing_coa_fields_ids" eval="[(6, 0, [ref('mof.coa_field_a_10rf_annual_rev')])]"/> </record>
3. 验证外部ID与字段定义
- 确认
mof.coa_field_a_10rf_annual_rev这个外部ID拼写完全正确,且对应的coa.field.mapping记录已成功创建。 - 检查
account.account模型中existing_coa_fields_ids字段的定义是否正确,示例:
from odoo import models, fields class AccountAccount(models.Model): _inherit = 'account.account' existing_coa_fields_ids = fields.Many2many( 'coa.field.mapping', string='Existing COA Fields' # 如需自定义中间表,可添加relation、column1、column2参数,默认Odoo自动生成 )
4. 方法2的修正(创建并关联新记录)
如果需要直接创建coa.field.mapping记录并关联,确保字段值格式正确,name若为Many2one字段,需传入对应记录的ID:
<record model="account.account" id="l10n_qa.1_bank_template"> <field name="existing_coa_fields_ids" eval="[(0, 0, { 'name': ref('mof.field_cit_a_10rf_annual_rev'), 'cit_method': '01' })]"/> </record>
生效验证
完成修改后,卸载并重新安装你的模块,或执行命令行更新:
odoo-bin -d your_db_name --update your_module_name
进入Odoo后台查看l10n_qa.1_bank_template记录的existing_coa_fields_ids字段是否已关联目标记录。
内容的提问来源于stack exchange,提问作者KbiR
相关产品推荐
相关产品推荐

