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

继承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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:42:59