《Odoo 19 开发教材》习题参考答案

用途:供 教师备课、学员自测对照;建议 单独装订或与正文分册,避免课堂直接发全文。

范围:各章 「本章综合练习」 的参考要点;各节 「本节练习」 若正文已附 「参考答案提示」,本册 不重复,请对照 014999 正文

说明实操题、拓展阅读题 因环境与版本差异,答案以 思路与检查点 为主;代码需结合当前 Odoo 源码与官方文档核对。


第一章 —— 概念总论

  1. 示意图:自顶向下:用户点击菜单ir.ui.menu(解析 action)→ ir.actions.act_windowres_modelview_modecontextdomain)→ WebClient 请求 load_views / search_readmodels.Modelir.ui.view 的 arch 合成界面。数据回写走 call_kw(write/create) 回到模型。
  2. 三项ACL/记录规则(列表隐藏≠不能 RPC)、服务端逻辑create 绕过只读视图)、文件/报表下载Controller 自定义路由 等;invisible 不触及上述层。
  3. 拓展:按当前 ORM Changelog 摘录一条,例如 record._crrecord.env.cr_search_display_name 相关说明。

第二章 —— 模型

  1. training.session(Transient)TransientModel,字段如 course_ids(Many2many 或 line),按钮调用 training.course.create([...])create 多字典;注意 Transient 自动清理,不宜存长期业务。
  2. store=True 计算字段:利:搜索、排序、列表聚合、避免重复计算;弊:占磁盘、写放大、@api.depends 漏依赖导致脏数据、升级迁移成本

第三章 —— 字段类型

  1. library.loanbook_id Many2one ondelete='restrict'(书被删时禁止或需业务处理);user_id required=Trueplanned_return_date Datebook_idindex=True
  2. related:当值 完全由另一路径字段导出、无额外业务逻辑 时用 related;若需 复杂条件、聚合、默认值compute

第四章 —— ORM 核心操作

  1. merge_partners(思路):备份 → 选 主 partnerwrite 子表外键sale.orderaccount.move 等)partner_id重复地址/标签合并unlink 被合并方;生产需 事务、幂等、日志;更稳妥可用 官方/OCA merge 工具模式
  2. sudo vs with_usersudo超级用户 绕过规则,审计难with_user(user)指定用户权限 执行,利于合规;敏感集成用 专用技术用户 + 显式 with_user,并 记录 message_post / 自定义日志

第五章 —— 小部件

  1. 表单:state widget="statusbar"cover widget="image"(Binary);列表 sequence + widget="handle"
  2. M2M 颜色:comodel 加 color Integer(0–11 等),视图 color_field="color"(看板/标签 widget 以版本为准)。
  3. Legacy → OWLRegistry 注册props/record 契约资产声明去掉 Widget.extend补测试查官方字段组件范例
  4. sum 局限:列表 sum 常只对 当前页/当前结果集全表合计read_group、SQL、会计报表服务端聚合

第六章 —— 交叉引用

  1. 三种跨库/跨环境 id 不同;模块卸载重装 id 变;数据迁移 后整数 id 不稳定——必须用 XML ID / ref
  2. 菜单消失:查 ir.model.data 是否存在该 menuitem idir.ui.menu activegroups_id父菜单是否被删依赖模块未装升级时视图/XML 报错 导致事务回滚。
  3. 两模块同父菜单共同依赖 定义父菜单的模块;sequence 固定顺序;避免 两模块 互相 depends 成环。
  4. 生产勿加载 demodemo 数据不入生产datanoupdate 策略 需评审。

第七章 —— 安全性

  1. STRIDE 示例欺骗→密码+2FA;越权→ACL+规则+check_access信息泄露→字段 groups、导出审计、日志脱敏。
  2. create ACL:ORM 应 拒绝 create;用 HttpCase / RPC assertRaises(AccessError) 验证 不可创建
  3. 读者/管理员:组 Portal/User vs ManagerACL 读者 读自己的 loan规则 domain (user_id','=',uid)关联 partner;管理员 宽规则或单独组
  4. 拓展:记录 测试用 with_user、勿默认 admin 断言安全 等官方表述。

第八章 —— 视图

  1. 四套视图 + act_windowlistformsearchkanbanir.ui.view + ir.actions.act_window 指定 view_modexml id
  2. 双继承:两模块 inherit_id 同父视图,设不同 priority(整数);数值小的优先(以文档为准)——升级后 对比表单字段序
  3. 10 万条:视图层 分页、limit、不默认全表;ORM search 带 limit索引;DB EXPLAIN禁止无 domain 全表 scan
  4. Checklist 示例:xpath 唯一锚点移动端 可编辑列表;字段 groups_() 可译无障碍 title/label

第九章 —— 动作

  1. 数据流菜单 actionir.actions.act_window id → 客户端 load_actionres_model、viewsir.ui.view arch + fields_get
  2. 判断binding 不能替代 ACL
  3. 借阅超期服务器动作——自动化/cron 或 ir.actions.servermail.mail/activity客户端动作——仪表盘 act_window 或 client action 展示 KPI**。
  4. 空白模型名拼写模块未装无 ACLdomain 过滤光视图 arch 报错(升级日志)。

第十章 —— 菜单

  1. 同 action 两菜单:利 配置省重复;弊 面包屑/书签难分不同 context/domain/默认视图 时应 拆两个 act_window
  2. i18n用户可见字符串_() / PO技术 XML ID 不译。
  3. 示意图菜单 groups → 可见动作打开模型ACL 决定 CRUD规则过滤行
  4. action 格式ir.actions.act_window,<db_id> 字符串(或等价格式,以技术字段为准)。

第十一章 —— 数据文件

  1. <function>model="library.book" name="action_fill_default_code",方法内 ir.sequence 或规则生成 default_codesearch([('default_code','in',[False,''])]) 批量更新。
  2. <delete search=...>全量备份staging 演练统计 search_count维护窗口回滚脚本
  3. noupdate:首次 ir.config_parameter 默认值noupdate="1";用户改后升级 不覆盖;若需强制更新 单独迁移或临时改 noupdate
  4. post_load:Python 侧 钩子不替代 data XML;用于 monkeypatch/注册 等(以官方为准)。

第十二章 —— 继承机制

  1. library.member_inherits = {'res.partner': 'partner_id'}partner_id required视图 inherit base.view_partner_formlevel
  2. 对比表:经典 同表扩展、JOIN 少、升级 xpath 风险;委托 多表、JOIN、适合「会员是一种伙伴」;原型 复制模型、数据重复、慎用
  3. product.product:查阅源码 _inherits 指向 product.template_inherit 扩展 等——按实际代码写一句。
  4. Delegate 警告删除委托记录对子记录影响性能 等(摘自官方 Inheritance)。

第十三章 —— QWeb 模板

  1. 收据 PDFreport + QWebt-call 页脚t-field 页码;表体 t-foreach 借阅行
  2. 角色运营可筛选导出 Excel客户/存档版式固定的 PDF
  3. t-raw 审计用户 HTML需改 t-out/消毒静态模板可信
  4. deprecated:按当前 QWeb 文档记 一条(如 t-raw 迁移)。

第十四章 —— 系统架构总览

  1. 序列图Browser call_kw(load_views)Odoo ControllerRegistry 模型+视图search_readPostgreSQLJSON 返回OWL 渲染
  2. 指纹hash 文件名长期缓存内容变则 hash 变客户端重新拉取
  3. JS 不生效-u 模块硬刷新/清缓存CDN 缓存?debug=assetsassets 路径/@odoo-module
  4. 对比:后台 SPA SEO 弱、首包大、交互强Jinja SEO 友好、首屏简单、交互弱

第十五章 —— 数据库操作

  1. 误删恢复停写从备份恢复 PGPITR 若可用)→ filestore 对齐时间点业务抽检事故沟通
  2. 取舍read_group——尊重规则、ORM 缓存、复杂 domain 方便SQL——极复杂聚合/性能极限、须防注入与绕过规则意图
  3. 月度统计:ORM read_group + domain 日期;SQL GROUP BY date_trunc('month',...) + 参数化
  4. 备份加密磁盘/磁带加密密钥与备份分存访问审计脱敏副本

第十六章 —— Odoo 核心数据结构

  1. ERres.userspartner_idres.partnerusersgroups M2Mcompany_ids / company_id 多公司。
  2. ir.model.data:下次 -u 可能 重建记录孤儿菜单——取决于 XML 是否仍存在;常导致 重复或加载失败
  3. Transient 例子向导、mail.compose.message 等——短期数据
  4. Registry启动时按依赖加载 ir.model,再 注册 Python 模型类——一句话:元数据先于业务 Registry 就绪

第十七章 —— SmartButton 设计

  1. 设计loan_count(未还) compute search_count state=borrowedhistory_count search_count 全部历史;或 One2many + related 视需求。
  2. 性能store=True 适合 大表频繁打开、需排序筛选read_group 适合 数据量小或强实时可接受每次算
  3. 无障碍title/aria-label搭配文字链接不只图标
  4. 拓展:摘录 action_view_*self.env['ir.actions.actions']._for_xml_id(...) 打开窗口。

第十八章 —— 工作流与状态机

  1. 状态图draft → submitted → approved → donecanceldraft/submitted禁止 done → draft(除非业务允许反冲)。
  2. 并发双写最后一条覆盖重复提交;防护:SQL 约束、write 校验状态、@api.constrains、乐观锁版本字段
  3. 合规:金融/医疗等需 审计追踪mail.thread 有帮助未必满足「不可篡改」——需 WORM/外部审计
  4. 借阅单状态 + mail.activity 提醒经理 + cron 扫超期 activity_schedule

第十九章 —— 报表引擎

  1. 借阅汇总Wizard TransientModel 输入 起止日期report_actiondata → QWeb t-foreach 聚合查询结果read_group 或 SQL)。
  2. 跨公司with_company 明确公司domain 带 company_id禁止 sudo 无界查询规则测试
  3. PDF 内存减小每页数据量分页渲染查 wkhtmltopdf 日志避免模板无限嵌套 t-foreach
  4. Paper format纸张与边距layout 决定 页眉页脚与 CSS——二者配合出成品 PDF

第二十章 —— 邮件系统

  1. 时间线提交message_post 通知经理 + activity审批状态消息完成感谢邮件模板mail.template)。
  2. 保留 7 年分区/归档 mail.message冷存储压缩附件独立邮件归档系统
  3. 外发失败SMTP 配置端口/TLS防火墙SPF/DKIMOdoo 日志 mail
  4. Discuss/bus长轮询/WebSocket 推送bus 服务 相关(按官方一句)。

第二十一章 —— 定时任务

  1. 归档:优先依赖 框架对 Transient 的自动清理;若自定义 大批量——cron unlinklimit 分批
  2. 告警cron try/except + _logger + 写 ir.logging / 发 mail.mail / webhook
  3. 10 万提醒单 cron 批处理id 范围分段避免每用户一条 SQL索引 next_call 字段
  4. admin 风险绕过规则;用 专用用户显式 with_user最小权限

第二十二章 —— 序列号

  1. LO/2026/00001ir.sequence prefix='LO/%(y)s/'(或 %(range_year)s 视语法)、padding=5每年新 sequence 或使用 use_date_range(以版本为准)。
  2. CSV 5000 条预分配 ref导入后统一 write 触发序列避免手输 ref 冲突——导入前 search 重复
  3. no_gap性能差/锁竞争回滚仍耗号——一句记风险
  4. 多公司company_id 不同可同 code 独立 number_next切换公司各建一条 sequence 验证

第二十三章 —— 翻译与国际化

  1. 报表语言用户 lang 个性化公司默认 统一对外;利弊:法务一致性 vs 用户体验
  2. hreflang多语言 URL搜索引擎地域Odoo 多网站正确 alternate 链接(笔记一句)。
  3. Review 规则用户可见字符串禁止中文硬编码在 Python——必须 _()
  4. JSONB zh_CNname->>'zh_CN'PostgreSQL)或 #>> '{zh_CN}'以字段结构为准)。

第二十四章 —— 向导

  1. 防重复提交前端 disable 按钮后端 write 幂等/状态机DB unique 约束
  2. 审计:Transient 不留痕业务结果 message_post写持久模型日志
  3. 删除确认Char 字段 confirmation@api.constrains 校验 == DELETE
  4. 清理周期Transient 自动删除——通常数小时到一天量级(查 ir.cron / 官方说明)。

第二十五章 —— 看板与高级视图

  1. 角色:销售 看板看阶段;调度员 日历看时间资源理由各一句自洽即可)。
  2. 性能缩小 domainlimitread_group 列统计减少卡片装饰索引分组字段
  3. 共用字段同一 library.loanstage_id 看板 + date_end 日历勿拆两模型 除非生命周期不同。
  4. card 迁移Odoo 19 用 <card>/新结构——升级 xpath 与模板要对照 8.3
  5. 判断:正文已给 「对,若 write 命中且约束含该字段」

第二十六章 —— 仪表盘

  1. 缓存 5 分钟 user.id + company.id + KPI 名失效超时 TTLBus 订阅业务写入
  2. 权限证明:用户 A 仅能看本公司订单ORM search_count 与界面 KPI 一致构造跨公司 domain 应被规则挡
  3. 不一致时区边界订单状态筛选不同多公司上下文缓存未刷新
  4. 手动刷新按钮 clear cache state + 重新 orm.searchRead

第二十七章 —— 编码规范

  1. Review 清单(示例)有无 sudo/SQL 注入测试是否加xpath 注释_()N+1模块 depends秘密不进 Git权限 CSV性能热点升级脚本
  2. pre-commitruffend-of-file-fixertrailing-whitespacecheck-xml 等。
  3. 2000 行视图按模型/功能拆 XML文件命名清晰inherit 分文件
  4. 判断,PEP 8 非语法

第二十八章 —— 调试工具

  1. N+1SQL logger大量相似 SELECT by id单次重查询 单条大 SQL / Network 一次 search_read 字段过多
  2. 脱敏邮箱/手机/hashtoken 不全打PII 合规最小化
  3. 调试点Browser → Network路由Controllercall_kwORMSQLPG
  4. HttpCase断言 status_codelog captureassertLogs)区分 404 与 500

第二十九章 —— 测试体系

  1. CI 矩阵最小 单 Odoo 版本 × 官方支持 Python 之一;理由:降本;扩展再加矩阵。
  2. setUpClass vs XMLClass 快、共享昂贵数据XML 贴近真实数据、慢;反之 隔离差 / 维护成本
  3. 本地绿 CI 红时区-at_install 标签缺少依赖模块demo 数据随机顺序
  4. 安全:见正文 参考答案提示

第三十章 —— 权限与安全

  1. 红队SQL 拼接越权 id 遍历CSRF 伪造 POST
  2. GDPR匿名化备份含删除权日志删除策略
  3. 列表见号打不开列表与表单 ACL 不一致表单视图 groups / 规则在 read 更严
  4. 实操测试用户 切换 验证 domain预期行数

第三十一章 —— 性能调优

  1. 1 万条流畅分页/search limit避免可编辑全表虚拟滚动(视 web 支持)domain 预筛选
  2. VACUUM/ANALYZE低峰窗口;风险 IO 飙升、锁
  3. Seq Scan加索引修正 domainANALYZE减少 order 无索引字段
  4. 读路径search_read → ORM prefetch → SQL → PGprefetch 在关系字段批量读时

第三十二章 —— OWL 框架

  1. Systrayregistry systray 注册组件;useService("orm")mail 未读数;点击 actionService.doAction 打开 Discuss。
  2. Service + BusService setInterval poll结果放 Bus 事件列表组件 useBus 刷新
  3. 迁移列 Widget 名 → 找 Registry 字段组件 → 改模板 widget → 删 legacy
  4. 子组件编辑备注父 state + 子 props 回调 onSave不用 Bus 传正文
  5. 阅读:按官方 Dialog slots 文档 勾选 props 类型

第三十三章 —— JavaScript 开发

  1. 避免重复 patch合并补丁模块上游冲突升级难测
  2. 前端 domain禁止仅信——须后端重写/校验
  3. 两路径标准 RPCsession+jsonrpc自定义 ControllerCSRF/token 文档
  4. 实操useService("user")session 信息db 名以 API 为准)。

第三十四章 —— CSS/SCSS 与样式

  1. 暗色全局语义变量组件 局部 class 覆盖
  2. 魔法数只允许 SCSS 变量design token 文件
  3. 错乱先看 DOM选择器是否仍命中资产顺序/!default
  4. Coverage看同一 SCSS 是否进多个 bundle——重复 import

第三十五章 —— 组件开发

  1. 命名示例my_lib_loan_cardmy_lib_isbn_fieldmy_lib_kpi_badge
  2. aria 清单图标按钮必有 label表单控件关联 label焦点可见错误 aria-live不只用颜色表意
  3. x2many新增行保存删除行Tab 切格丢焦点任二
  4. 单测mock record.update 断言调用DOM 文本
  5. Html widget禁止 t-raw 用户内容服务端再消毒限制 script/iframe
  6. 阅读:官方 slotsDialog 示例。

第三十六章 —— 前端路由与控制器

  1. JSON 列表GET /api/books?limit= request.env['library.book'].search_readHttpCase url_open 断言 JSON
  2. Rate limitNginx limit_req + 应用内 token 桶
  3. REST vs jsonrpcREST外部系统集成jsonrpc同源 WebClient/深集成
  4. UserErrorJSON-RPC 包装错误;记录 notification 文案HTTP 码

第三十七章 —— 外部 API

  1. 幂等 create外部 idempotency_key 字段 unique;或 ir.model.data 映射重试先 search
  2. 审计字段caller、db、model、method、args_hash、duration_ms、status、error、uid、timestamp
  3. 高吞吐RPC 批处理 低延迟同源REST+队列 削峰、异构消费者
  4. 集成用户禁 Settings/Technicalbase.group_system仅业务 API 组

第三十八章 —— REST 与 Webhook

  1. OAuth2 vs API KeyOAuth 轮换短 token、审计细API Key 实现简单、需 IP 限制+轮换
  2. 版本协商小团队 /v1/大平台 Header 协商多版本并存
  3. Webhook 接收HMACIP 允许列表事件 id 幂等限流
  4. HttpCase无/错 Key assertEqual(res.status_code, 401)

第三十九章 —— Extract API

  1. 合规保留期 7 年/按法务仅财务组读附件备份加密访问日志
  2. 成本附件 hash 去重批量上传失败重试退避
  3. 泳道用户上传 → Odoo 存附件 → 调 Extract → 回写 wizard → 会计确认 → account.move
  4. 拒绝入账低置信度缺税号金额异常供应商黑名单

第四十章 —— IoT 硬件集成

  1. 100 台升级分批 canary失败回滚固件门店离线缓存队列
  2. 证书轮换新证双绑客户端全量更新老证过期下线
  3. 延迟排查先看局域网IoT CPU/内存驱动重试/日志
  4. 组件图POS → Odoo server → IoT Box → 打印机/扫码

第四十一章 —— AI 智能化集成

  1. 脱敏去 PII摘要替代全文假名化
  2. 成本按调用计费chatter 先 summarize 再送模型缓存 FAQ embedding
  3. 内控AI domain 弱于固定筛选器可注入、难审计)。
  4. 禁止送入 AI密码、token、卡号、薪资、健康、未公开合同全文

第四十二章 —— 安装与配置

  1. 容量worker ≈ 1+2×CPU 上限受 RAM反例长报表占满 worker 公式失效
  2. 备份WAL PITRfilestore 与 DB 同一时间戳 防孤儿附件
  3. 502Nginx upstreamworker OOMPG 连接满磁盘满超时
  4. 拓扑用户 CDN Nginx Odoo PG 一线图

第四十三章 —— CI/CD 与自动化运维

  1. 蓝绿与长事务绿切流量前 须等长事务完读写分离Odoo 长事务 易堵迁移
  2. 密钥deploy key 只读拉代码secret 管 API token
  3. 周五发布备份截图-u 顺序清单rollback tagstaging neutralize 验证
  4. artifactactions/upload-artifact 指向 odoo.log 条件 failure()

第四十四章 —— 版本管理

  1. 回滚停服务DB 还原filestore 对齐代码 git checkout tag冒烟
  2. rename model迁移脚本改表名ir.model.data 更新外键/M2M 引用表名
  3. 17→19 检查Python 3.12_cr/json 路由资产Changelog迁移脚本阶段
  4. PR 模板备份证明、staging 日志、回滚负责人 @、风险登记

第四十五章 —— 模块设计模式

  1. 策略模式上下文 sale.order接口 compute_price注册表 dict[str,Strategy]
  2. README简介、安装、配置、依赖、已知问题、升级、许可、截图、支持
  3. mixin 冲突方法加模块前缀 _sale_* / _purchase_*抽象子 mixin
  4. 抽 mixin重复 _compute_domain_openlibrary.domain.mixin

第四十六章 —— 高级开发

  1. 大作业:按 模型→安全→视图→报表→网站页→Controller→tests 分期交付检查单 自评。
  2. 翻车点多公司库存未按公司隔离网站价目取错 pricelistpublic 路由泄露内部数据
  3. Reviewxpath 冲突Studio x_* 命名sudo测试覆盖 sale 扩展升级脚本
  4. 分工45 模式与多公司货币底层46 Studio/网站/Spreadsheet 产品层
  5. 判断
  6. 46.9密钥泄露、无法吊销、打印扩散(合理即可);判断 错。
  7. 46.10Sign 含产品化签署流程与证据链(一句);判断 错。
  8. 46.11可复制文本/截图 故不能单靠水印保密;判断 错。
  9. 46.12PDF 固定归档/打印 vs Word 可编辑交付判断 错。

第四十七章 —— 常见应用场景

  1. 47.1 练习 1RPC/Cron/服务器动作 等路径 不保证与 UI 相同假设,仅靠界面无法覆盖 API 层隔离
  2. 47.1 练习 2sudo 绕过规则不能依赖 env.company 自动隔离。
  3. 47.2 练习 1company_id = ? → 单字段索引常够用;同时状态/日期/排序(company_id, state)复合索引 更匹配 组合 WHERE
  4. 47.3 练习 1序列号 一物一码批次 同 SKU 多数量共 lot
  5. 47.3 练习 2依流程;常见 拣货/发货 指定, 订单行必选。
  6. 47.4 练习 1易把归档数据拉回业务查询;配合 sudo弱规则泄露风险 上升。
  7. 47.5 练习 2破坏请求事务语义与重试/并发不协调部分成功难排查优先队列/分批在可控边界提交
  8. 综合简图示例HTTPrequest.env(user/company)ir.rule 拼 domain_search 生成 SQLPostgreSQL。(表述合理即可。)

第四十八章 —— AI 集成

  1. 48.0 练习 1回复载体mail/discuss 消息线程,依赖 mail 的 follower、权限、通知与 UI
  2. 48.1 练习 1:把 不同入口(顶栏、chatter、composer) 映射到 不同 Agent 与默认提示,避免 一套配置打天下
  3. 48.1 练习 2_trigger() 仍会执行。
  4. 48.2 练习 1不同 embedding 模型向量空间不同,混用 检索无意义
  5. 48.3 练习 1仍有 _get_message_with_access / 频道校验访客上下文add_guest_to_context 等到 env(表述合理即可)。
  6. 48.3 练习 2
  7. 48.3 练习 3缓冲导致 chunk 攒批失去流式/打字机长时间无输出直至超时(表述合理即可)。
  8. 48.3 练习 4不宜无状态混用SSE 草稿 + message_post 定稿单通道(与正文一致即可)。
  9. 48.4 练习 1单次 API 返回中 并行 tool_calls 最多处理条数(与日志「limit reached」一致)。
  10. 48.5 练习 1大列表被省略分析可能缺字段 → 应 显式工具查询或缩小范围
  11. 48.5 练习 2
  12. 48.6 练习 2可执行、可审计,减少 无法验证的建议
  13. 综合 1用户消息/ai/generate_response(jsonrpc)_generate_response_for_channelLLMApiServicemessage_postDiscuss/Bus 推送前端(可简化)。
  14. 综合 2SSE:打字机 UX、需 流式路由与超时/缓冲 治理;整段发帖:实现简单、长生成阻塞差分 UX。(各两条合理即可)。
  15. 综合 3限制候选附件缩小索引范围 + 防跨源泄露(checksum 来自 当前 agent 的 sources)。
  16. 综合 4成本暴涨worker 长时间持锁/超时滥用工具(任两条)。

第四十九章 —— Odoo 环境部署

  1. 49.1 练习 1隔离依赖、避免污染系统 Python、便于多版本并存
  2. 49.1 练习 2admin_passwd 为数据库管理主密码
  3. 49.2 练习 2无 TLS、缺 WAF/限流、暴露数据库管理;应 443 + 反向代理
  4. 49.3 练习 1与 Linux 文档一致、编译链完整、少踩 Windows 原生编码/路径坑(任两条)。
  5. 49.3 练习 2
  6. 49.4 练习 2Homebrew 安装的库不在默认搜索路径,需 LDFLAGS/CPPFLAGS 辅助 psycopg2 等编译
  7. 49.6 练习 1缺字体子集/嵌入不当引擎不支持该字体格式(与 第十九章 §19.2 一致即可)。
  8. 49.6 练习 2开放题;要点:wkhtmltopdf --version(若栈为 wkhtml)、界面打印含中文 QWeb-PDF、失败时对照 §49.6.6第四十二章 时限。
  9. 综合 2Nginx/代理worker 与资源限制日志与备份第四十二章 自拟节名合理即可)。

第九十九章 —— 附录(印刷装订前自检)

  1. 图档rg '\./images/[^)]+' -o 去重images/ 目录列表 diff。
  2. 排版Pandoc 一章代码是否断行乱码表格加 \longtable 模板(按需)。
  3. 习题册即本文件勿与学员版 PDF 合并
  4. checklist 示例读 Changelog → grep 废弃 API → 跑 upgrade_code → 副本库 -u → 跑测试 → 回滚演练
  5. Domain vs SQL:Domain 前缀逻辑+ORM 权限;SQL 中缀 WHERE+须自管权限

文档版本:与 odoo19开发白皮书 正文同步维护;发现与官方文档冲突时以官方为准。