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

Odoo15自定义模块继承crm.lead时出现Many2many字段冲突错误

解决Odoo继承crm.lead时多对多字段冲突的问题

错误原因分析

使用_inherit = 'crm.lead'同时指定_name = 'xpf.reporting'属于替换式模型继承,Odoo会复制原模型的所有字段到新模型,但多对多字段默认复用原模型的中间关联表。crm.lead.tag_ids的中间表会被新模型xpf.reporting.tag_ids直接使用,导致表和字段重复绑定,触发TypeError。

解决思路与方案

方案1:扩展原crm.lead模型(无独立数据表)

如果不需要独立的报表数据表,只是想给CRM线索添加报表相关字段和功能,直接去掉_name,仅保留_inherit:

class XPFReporting(models.Model):
    """
    CRM线索报表扩展模块
    """
    _inherit = 'crm.lead'
    _description = "XPF Reporting"

    custom_field = fields.Char(string='Custom Field')

对应视图需调整模型为crm.lead,或在原CRM视图中添加报表按钮;若需独立入口,可基于crm.lead创建新动作和菜单。

方案2:创建独立报表模型(推荐)

若需要独立的数据表存储报表相关数据(如过滤后的结果、自定义配置),放弃继承,改用关联或同步方式获取CRM数据:

class XPFReporting(models.Model):
    _name = 'xpf.reporting'
    _description = "XPF Reporting"

    lead_id = fields.Many2one('crm.lead', string='CRM线索', required=True)
    custom_field = fields.Char(string='自定义字段')
    # 通过关联字段获取CRM数据
    lead_name = fields.Char(related='lead_id.name', string='线索名称')
    partner_id = fields.Many2one(related='lead_id.partner_id', string='客户')

这种方式完全独立于原CRM模型,不会有字段冲突,可自由定义报表所需字段,通过定时任务或手动同步按钮将CRM数据导入到报表模型中。

方案3:重新定义冲突的多对多字段(不推荐)

若必须继承原模型字段且保留独立表,需手动重新定义所有冲突的多对多字段,指定新的中间关联表:

class XPFReporting(models.Model):
    _name = 'xpf.reporting'
    _description = "XPF Reporting"
    _inherit = 'crm.lead'

    custom_field = fields.Char(string='Custom Field')
    # 重新定义tag_ids,指定新的中间表
    tag_ids = fields.Many2many(
        'crm.tag',
        'xpf_reporting_tag_rel',  # 自定义中间表名
        'reporting_id', 'tag_id',  # 自定义外键列名
        string='标签'
    )

⚠️ 注意:需检查原模型所有多对多字段(如category_ids等),逐一重新定义,否则仍会有冲突,维护成本较高。

内容的提问来源于stack exchange,提问作者Claudiu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:17:33