继承calendar.event模型触发两类报错,寻求解决方案
解决继承calendar.event时的Many2many字段冲突问题
问题分析
你遇到的两个错误本质是继承模型时的Many2many字段表冲突:
- 不重定义
categ_ids时,新模型meeting.room会继承原calendar.event的categ_ids字段,但两者共用同一个中间表calendar_event_categ_rel,而该表的外键指向原模型的表,导致冲突。 - 重定义后报错是因为模块升级时中间表未被正确创建,或者残留的旧表导致外键字段不匹配。
解决步骤
1. 修正字段定义
必须重定义categ_ids,指定专属的中间表和对应外键字段,确保和原模型的中间表完全隔离:
class MeetingRoom(models.Model): _name = 'meeting.room' _inherit = "calendar.event" categ_ids = fields.Many2many( 'calendar.event.type', 'meeting_room_categ_rel', # 自定义唯一中间表名 'meeting_room_id', # 指向当前模型的外键字段 'type_id', # 关联标签模型的外键字段 string='Tags' ) room_id = fields.Many2one('meeting.room.room')
2. 清理并重新安装模块
出现UndefinedColumn错误时,需要彻底清理旧的数据库残留:
- 先在Odoo后台卸载当前模块;
- (可选)用pgAdmin等工具连接数据库,手动删除可能存在的
meeting_room_categ_rel旧表; - 重新安装模块,Odoo会自动创建结构正确的中间表,包含
meeting_room_id和type_id两个外键。
关键原理
原calendar.event的categ_ids依赖中间表calendar_event_categ_rel,外键绑定calendar_event表的主键。当你创建新模型继承它时,新模型的数据库表是meeting_room,若复用原中间表,外键会因表不匹配触发冲突。重定义字段并指定新中间表,就能让新模型的标签字段拥有独立的关联表,彻底解决冲突。
内容的提问来源于stack exchange,提问作者Raskolnikov
相关产品推荐
相关产品推荐

