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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:11:15