出库时的 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 拆行。
嵌入式动作看起来像“只给某条记录用”的快捷入口。实际上,它会同时看 active_id、父记录、用户、分组和 domain。
你明明没写 `('active', '=', True)`,搜索结果却默认把归档记录排除了;你明明知道有那条数据,下拉框却像没看见它。很多这类问题,根子都在 active_test 这层隐式过滤上。
很多人把 _inherits 当成“高级版 _inherit”,结果越做越乱。其实它更接近“当前模型通过一个 Many2one 代理父模型字段”,本质是组合建模,不是 Python 继承。
从 Odoo ORM 源码讲清 new() 产生的伪记录到底是什么,为什么它能触发 onchange、计算字段和 x2many 交互,却并没有真正写入数据库,以及 _convert_to_write 在保存前扮演什么角色。
很多人一看到 replenishment scheduler 报错,就直觉认为这一轮补货全军覆没。但在 stock_orderpoint.py 里,Odoo 实际采用的是“savepoint + 聚合异常 + 失败项剔除 + 剩余继续”的处理方式。本文聚焦 orderpoint 调度本身,解释为什么 warning activity 往往代表部分失败而不是整批失败。
很多人勾选一个组以后,发现用户权限自己多了一串组。真正原因不是后台在“乱补”,而是 res.groups 通过 implied_ids 计算 all_implied_ids,再让用户 all_group_ids 获得传递闭包;portal、public、employee 这类组还存在互斥约束。