继承Odoo Res.Partner模型时出现Many2many字段报错
解决Odoo学生模块启用报错:many2many字段表冲突
问题描述
开发继承自Res.Partner(联系人)的学生模块,仅新增“我的学生”菜单,未修改或添加任何字段,启用模块时出现以下报错:
TypeError: many2many fields my.students.channel_ids and res.partner.channel_ids use the same table and columns
原因分析
你创建的my.students模型继承了res.partner,而res.partner本身包含channel_ids这个many2many字段。当以新建独立模型的方式继承(_name='my.students' + _inherit='res.partner')时,Odoo默认复用原字段关联表的逻辑会失效,导致系统尝试生成的新关联表与原表冲突。
解决方案
方案1:修改模型字段的关联表配置
如果必须保留独立的my.students模型,显式重新声明channel_ids字段并指定唯一关联表:
from odoo import models, fields class MyStudents(models.Model): _name = 'my.students' _inherit = 'res.partner' channel_ids = fields.Many2many( 'mail.channel', relation='my_students_mail_channel_rel', # 自定义唯一关联表名 column1='student_id', column2='channel_id', )
方案2:无需创建新模型,用过滤器实现“我的学生”菜单
如果仅需筛选学生类联系人,直接基于res.partner创建带过滤条件的菜单即可,完全避免字段冲突:
在模块views目录下创建菜单配置文件(如my_students_menu.xml):
<odoo> <menuitem name="我的学生" id="menu_my_students" parent="base.menu_contacts"/> <record id="action_my_students" model="ir.actions.act_window"> <field name="name">我的学生</field> <field name="res_model">res.partner</field> <field name="view_mode">tree,form</field> <!-- 根据实际业务设置过滤规则,比如用分类标签区分学生 --> <field name="domain">[('category_id.name', '=', '学生')]</field> </record> <menuitem name="我的学生" id="menu_my_students_action" parent="menu_my_students" action="action_my_students"/> </odoo>
内容的提问来源于stack exchange,提问作者Nguyen Nguyen Hong
相关产品推荐
相关产品推荐

