You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 22:45:11