出库时的 stock.move.line 是如何确定的
用通俗但不失源码细节的方式,讲清楚 Odoo 出库时 stock.move.line 的生成逻辑:从 stock.move、stock.quant、移除策略到 lot/serial 拆行。
CATEGORY FOCUS
聚合 Odoo 开发基础、源码理解、ORM、模型、视图、安全与扩展实践。
TOPIC PICKS
用通俗但不失源码细节的方式,讲清楚 Odoo 出库时 stock.move.line 的生成逻辑:从 stock.move、stock.quant、移除策略到 lot/serial 拆行。
approvals 的 request 创建并不只是写一条单据;审批人来源、字段快照、顺序审批与状态推进都在一条后端链里。这里重点讲 request
从预约 booking、发票/支付到销售行创建 task,讲清网站、支付、销售与项目如何把一次预约变成可执行任务。
不再泛讲 field groups 全景,而是只解释一个实战规则:给 invisible、readonly、required 表达式提供值的控制字段,为什么应该放进 view 且与被控制节点保持同组覆盖,否则 NameManager 会报 Access Rights Inconsistency。
不再泛讲 domain_force 拼装,而是聚焦调试现场最常见的误判:开发者用 sudo 测 ir.rule,结果 _get_rules 直接返回空集合。文章只讲 sudo、allowed_company_ids 缓存键与 rule 调试顺序。
Odoo 里字段开启 tracking 后,并不是在 write() 之后直接拼一段变更文案。源码先在 precommit 保存旧值,再做 _message_track 对比,接着由 _track_subtype 决定是否升级成带 subtype 的消息,最后才在 Chatter 中生成可展示日志。这条链路决定了字段追踪到底是“静态差异”还是“有业务语义的协作消息”。
很多人还把 onchange 理解成“后端函数返回 value/warning,前端照单全收”。但 Odoo Web 端源码里的真实链路早已复杂得多:先构造内存 record,再做 snapshot,对 changed values、recompute 和多轮 onchange 处理后,最终只把 diff 回传给客户端。