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
相关产品推荐
相关产品推荐

