第十六章 Odoo 核心数据结构
篇别:第三篇 数据库与数据管理
本章学习目标
- 能说清
base/web/mail等核心模块在启动链中的大致分工。 - 理解
ir.model、ir.model.fields、ir.ui.view、ir.actions.*如何描述「元数据」。 - 熟悉
res.partner、res.users、res.company、res.groups的关系与多公司字段。 - 能通过 技术菜单与 Shell 追溯一条业务记录背后的「注册表」行。
导读:元数据与业务数据
业务数据存在 sale_order、library_book 等表;而 模型叫什么、有哪些字段、默认视图长什么样、菜单打开哪个动作,则存在 ir_* 与 res_* 一组 元数据表 中。二次开发与排错时,技术菜单就是数据库结构的「控制台」。
16.1 Base/Core 模块
16.1.1 知识要点
base:用户、公司、伙伴、货币、语言、模块列表、安全基础等;几乎所有模块 depends 包含base。web:WebClient、路由、会话、大量前端资源;无web则无后台界面(特殊 headless 场景除外)。mail:Discuss、chatter、mail.thread等;业务模块常 dependsmail以使用消息能力。
16.1.2 案例
# Shell
env['ir.module.module'].search([('name', 'in', ['base', 'web', 'mail']), ('state', '=', 'installed')])
16.1.3 截图占位

16.1.4 本节练习
- 简答:仅安装
base不装web时,典型使用场景是什么? - 实操:在技术菜单打开
ir.module.module,筛选state=installed,按依赖数排序(观察哪些被大量依赖)。
参考答案提示:1. 脚本、Shell、无 UI 集成等。
16.2 模型注册表(ir.model / ir.model.fields)
16.2.1 知识要点
ir.model:每个 模型名(model字段,如library.book)一条记录;关联 表名、模块 等信息。ir.model.fields:每个 字段 一条记录:name、ttype、relation、required、translate等。- 升级时:Python 声明变更会 同步 到上述表并可能 ALTER TABLE。
16.2.2 案例
技术菜单:设置 → 技术 → 数据库结构 → 模型 → 搜索 library.book → 字段 标签页浏览。
16.2.3 截图占位


16.2.4 本节练习
- 实操:新增 Python 字段后
-u,对比ir.model.fields行数变化。 - 简答:删除 Python 中某字段后升级,数据库列是否一定被删?
- 判断:
ir.model可由普通用户在界面随意新建。( )
参考答案提示:2. 不一定,有手动 _drop_column 迁移或保留列策略。3. 错,通常需技术权限。
16.3 视图注册表(ir.ui.view)
16.3.1 知识要点
arch_db/arch_fs:视图 XML 源码(存储方式随版本与部署而定)。key:部分视图用 稳定 key 供代码引用;外部 ID(module.xml_id)与ir.model.data对应。inherit_id:继承链;priority:合并顺序。type:form、list、search、qweb等。
16.3.2 案例
开发者模式:编辑视图 → 查看继承列表 或技术菜单打开 ir.ui.view 搜索 library.book。
16.3.3 截图占位

16.3.4 本节练习
- 简答:
key与 XML ID 的关系?何时用 key 更稳? - 实操:导出某视图 继承树 截图(开发者工具)。
参考答案提示:1. XML ID 在 ir.model.data;key 可用于无 XML id 或代码查找,依模块规范。
16.4 动作注册表(ir.actions.*)
16.4.1 知识要点
常见模型:ir.actions.act_window、ir.actions.server、ir.actions.client、ir.actions.report、ir.actions.act_url。
菜单 action 字段常存 ir.actions.actions 父表 id + 类型(实现细节以版本为准);技术菜单可打开具体子类型。
16.4.2 案例
搜索 ir.actions.act_window,res_model = library.book,核对 view_mode、context。
16.4.3 截图占位

16.4.4 本节练习
- 实操:用开发者工具 编辑动作 并导出 XML。
- 简答:删菜单与删 动作 对用户的不同影响?
16.5 核心业务模型(res.*)
16.5.1 知识要点
| 模型 | 职责 |
|---|---|
res.partner |
客户/供应商/联系人/公司地址等 |
res.users |
登录账号,链接 partner_id |
res.company |
法人实体、默认币种、抬头信息 |
res.groups |
权限组;category_id 分组显示 |
res.currency / res.lang |
币种与语言 |
多公司:用户可有 company_ids,当前 company_id(或 context allowed_company_ids)影响 默认值与记录规则。
16.5.2 案例
user = env.user
user.partner_id # 与登录关联的 partner
user.company_id # 当前公司
user.company_ids # 可访问公司集合
16.5.3 截图占位

16.5.4 本节练习
- 简答:
company_ids与company_id(当前公司)区别? - 实操:切换允许公司后打开带
company_id的列表,观察 domain 变化。 - 简答:
partner既是客户又是用户联系人时,常见字段设计?
16.6 外部标识符与元数据一致性
16.6.1 知识要点
删除 ir.model.data 一行 不等于 删除业务记录,但会导致 XML ID 丢失,下次升级可能 重复创建 或 无法 ref。详见第六章。
16.6.2 本节练习
- 简答:克隆生产库到测试库后,
res.users的 id 是否可能与开发库一致?为何仍推荐用 XML ID?
本章综合练习
- 绘制 ER 简图:
res.partner↔res.users↔res.company↔res.groups(多对多可简化为文字标注)。 - 说明:删除
ir.model.data中某菜单的 XML ID 行,下一次-u可能出现什么? - 调研:打开
ir.model中TransientModel为 True 的模型,列举 3 个例子及用途。 - 拓展:官方文档「Registry」与
ir.model加载顺序 关系(一句话)。
本章对应白皮书目录:第十六章 Odoo 核心数据结构。