Odoo自定义模块与account_accountant模块合并及多对多字段配置问题
问题:自定义模块与account_accountant合并时的多对多字段配置错误
需求
将自定义模块与account_accountant模块合并,使自定义模块的部分功能可在客户发票表单视图中使用。
代码实现
from odoo import fields, models, api class Acc_Xinv(models.Model): _name = 'acc.xinv' _inherit = ['x.invoice', 'account.move'] transaction_ids = fields.Many2many('account.move.transaction', 'transaction_channel_profile', '?', '?') class XInvoice(models.Model): _name = 'x.invoice' _inherit = ['mail.thread', 'mail.activity.mixin'] _description = "X-Invoice" _recname = 'name' _order = 'create_date desc' # 此处包含大量自定义字段与函数
问题与疑问
- 执行代码时出现错误(见截图)
- 需要创建新的多对多字段关联
acc.xinv与account.move.transaction两个模型,但account.move中不存在transaction_ids字段 - 疑问:多对多字段中应填写什么ID?该错误的含义是什么?
问题解答
1. 多对多字段参数的正确填写方式
Odoo的fields.Many2many字段定义需要四个核心参数:
- 第一个参数:关联的目标模型(你填的
account.move.transaction是正确的) - 第二个参数:多对多关系的中间表名称(需符合数据库表命名规范,不能含特殊字符)
- 第三个参数:当前模型(acc.xinv)在中间表中的外键字段名
- 第四个参数:关联模型(account.move.transaction)在中间表中的外键字段名
你用'?'占位是完全错误的,必须指定合法的字段名。遵循Odoo命名规范的正确写法示例:
transaction_ids = fields.Many2many( 'account.move.transaction', 'acc_xinv_transaction_rel', # 中间表命名:当前模型名_关联模型名_rel 'acc_xinv_id', # 当前模型外键:模型名_id 'transaction_id' # 关联模型外键:模型名_id )
2. 错误的含义
'?'是非法的数据库字段命名,Odoo无法识别这种占位符,导致系统无法创建多对多关系依赖的中间表,也无法建立两个模型的关联映射,最终会抛出数据库语法错误或模型加载失败的异常。
额外提醒
你的Acc_Xinv模型同时继承了x.invoice和account.move,需注意两个父模型是否存在字段冲突,避免后续出现其他加载异常。
内容的提问来源于stack exchange,提问作者for-loop
相关产品推荐
相关产品推荐

