第十六章 Odoo 核心数据结构

篇别:第三篇 数据库与数据管理

本章学习目标

  • 能说清 base / web / mail 等核心模块在启动链中的大致分工。
  • 理解 ir.modelir.model.fieldsir.ui.viewir.actions.* 如何描述「元数据」。
  • 熟悉 res.partnerres.usersres.companyres.groups 的关系与多公司字段。
  • 能通过 技术菜单与 Shell 追溯一条业务记录背后的「注册表」行。

导读:元数据与业务数据

业务数据存在 sale_orderlibrary_book 等表;而 模型叫什么、有哪些字段、默认视图长什么样、菜单打开哪个动作,则存在 ir_*res_* 一组 元数据表 中。二次开发与排错时,技术菜单就是数据库结构的「控制台」。


16.1 Base/Core 模块

16.1.1 知识要点

  • base:用户、公司、伙伴、货币、语言、模块列表、安全基础等;几乎所有模块 depends 包含 base
  • web:WebClient、路由、会话、大量前端资源;无 web 则无后台界面(特殊 headless 场景除外)。
  • mail:Discuss、chatter、mail.thread 等;业务模块常 depends mail 以使用消息能力。

16.1.2 案例

# Shell
env['ir.module.module'].search([('name', 'in', ['base', 'web', 'mail']), ('state', '=', 'installed')])

16.1.3 截图占位

图 16-1 应用列表中 base/web/mail 为已安装依赖

16.1.4 本节练习

  1. 简答:仅安装 base 不装 web 时,典型使用场景是什么?
  2. 实操:在技术菜单打开 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:每个 字段 一条记录:namettyperelationrequiredtranslate 等。
  • 升级时:Python 声明变更会 同步 到上述表并可能 ALTER TABLE

16.2.2 案例

技术菜单:设置 → 技术 → 数据库结构 → 模型 → 搜索 library.book字段 标签页浏览。

16.2.3 截图占位

图 16-2 ir.model.fields 列表筛选某模型

图 16-2b ir.model 表单上的 model 与 transient 标记

16.2.4 本节练习

  1. 实操:新增 Python 字段后 -u,对比 ir.model.fields 行数变化。
  2. 简答:删除 Python 中某字段后升级,数据库列是否一定被删?
  3. 判断ir.model 可由普通用户在界面随意新建。( )

参考答案提示:2. 不一定,有手动 _drop_column 迁移或保留列策略。3. 错,通常需技术权限。


16.3 视图注册表(ir.ui.view)

16.3.1 知识要点

  • arch_db / arch_fs:视图 XML 源码(存储方式随版本与部署而定)。
  • key:部分视图用 稳定 key 供代码引用;外部 IDmodule.xml_id)与 ir.model.data 对应。
  • inherit_id:继承链;priority:合并顺序。
  • typeformlistsearchqweb 等。

16.3.2 案例

开发者模式:编辑视图 → 查看继承列表 或技术菜单打开 ir.ui.view 搜索 library.book

16.3.3 截图占位

图 16-3 ir.ui.view 中 arch 预览

16.3.4 本节练习

  1. 简答keyXML ID 的关系?何时用 key 更稳?
  2. 实操:导出某视图 继承树 截图(开发者工具)。

参考答案提示:1. XML ID 在 ir.model.data;key 可用于无 XML id 或代码查找,依模块规范。


16.4 动作注册表(ir.actions.*)

16.4.1 知识要点

常见模型:ir.actions.act_windowir.actions.serverir.actions.clientir.actions.reportir.actions.act_url

菜单 action 字段常存 ir.actions.actions 父表 id + 类型(实现细节以版本为准);技术菜单可打开具体子类型。

16.4.2 案例

搜索 ir.actions.act_windowres_model = library.book,核对 view_modecontext

16.4.3 截图占位

图 16-4 按 res_model 筛选窗口动作

16.4.4 本节练习

  1. 实操:用开发者工具 编辑动作 并导出 XML。
  2. 简答:删菜单与删 动作 对用户的不同影响?

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 用户表单:Related Partner、默认公司

16.5.4 本节练习

  1. 简答company_idscompany_id(当前公司)区别?
  2. 实操:切换允许公司后打开带 company_id 的列表,观察 domain 变化。
  3. 简答partner 既是客户又是用户联系人时,常见字段设计?

16.6 外部标识符与元数据一致性

16.6.1 知识要点

删除 ir.model.data 一行 不等于 删除业务记录,但会导致 XML ID 丢失,下次升级可能 重复创建无法 ref。详见第六章。

16.6.2 本节练习

  1. 简答:克隆生产库到测试库后,res.users 的 id 是否可能与开发库一致?为何仍推荐用 XML ID?

本章综合练习

  1. 绘制 ER 简图res.partnerres.usersres.companyres.groups(多对多可简化为文字标注)。
  2. 说明:删除 ir.model.data 中某菜单的 XML ID 行,下一次 -u 可能出现什么?
  3. 调研:打开 ir.modelTransientModel 为 True 的模型,列举 3 个例子及用途。
  4. 拓展:官方文档「Registry」与 ir.model 加载顺序 关系(一句话)。

本章对应白皮书目录:第十六章 Odoo 核心数据结构。