Odoo 组合商品为什么要单独建模:product.combo 如何同时服务销售与 POS
基于 Odoo 官方 `product.combo`、`product.combo.item` 与 POS 扩展源码,讲清组合商品为什么不是“套餐描述文本”,而是一套可复用的数据模型,以及价格、免费数量、子项约束如何在销售与 POS 间共享。
ARTICLE LIBRARY
持续记录源码理解、业务流程、模块开发经验与踩坑总结。
基于 Odoo 官方 `product.combo`、`product.combo.item` 与 POS 扩展源码,讲清组合商品为什么不是“套餐描述文本”,而是一套可复用的数据模型,以及价格、免费数量、子项约束如何在销售与 POS 间共享。
基于 Odoo 官方 `rating.parent.mixin`、`rating.mixin` 与 `rating.rating` 源码,讲清评分明细为何要区分当前对象与父对象、满意度百分比怎样计算,以及父级 KPI 为什么不能简单拿子记录平均值代替。
基于 Odoo 官方 `rating.mixin`、`mail.thread`、`rating.rating` 与控制器源码,讲清评分请求怎样生成 access token、为什么未消费评分会被复用、用户提交后如何落库并回写到 chatter。
很多开发者会把 onchange、compute、constraints 都当成‘字段变了就会触发的东西’,结果一到线上就困惑:为什么界面上是对的,保存后又变了?为什么 onchange 跑了,但约束还没报?本文把表单编辑到真正写库这条管线按源码拆开。
很多人以为销售单一确认,系统就会顺着一条线自动走到发货和开票。但从 sale、sale_stock 源码看,Odoo 实际上把‘履约链’和‘开票链’拆开了:一条去生成 procurement / picking / move,另一条等 qty_to_invoice 条件成熟后再进 account.move。
很多 Odoo 性能问题不是复杂 SQL,而是开发者把 recordset 当成一堆彼此独立的小对象。结合 models.py 里的 _prefetch_ids、search_fetch、fetch、with_prefetch、grouped 与 sorted,可以看出 ORM 真正追求的是“整批记录共享预取上下文”,而不是“每条记录随取随查”。