出库时的 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 拆行。
很多人写 Odoo 定时任务时,只想着“把数据处理完”,却忽略了调度器本身的运行契约。基于 Odoo 19 的 `ir_cron.py` 源码,本文讲清 `_commit_progress()`、剩余时间、分批循环与部分完成状态,解释为什么一个健康的 cron 不是“尽量久地跑”,而是“持续可恢复地跑”。
很多 Odoo 性能问题不是复杂 SQL,而是开发者把 recordset 当成一堆彼此独立的小对象。结合 models.py 里的 _prefetch_ids、search_fetch、fetch、with_prefetch、grouped 与 sorted,可以看出 ORM 真正追求的是“整批记录共享预取上下文”,而不是“每条记录随取随查”。
很多人排库存补货问题时,只看到界面上一句“找不到规则”或“无法补货”,于是沿着单条错误去追。可在 stock_rule.py 里,run() 的职责其实是把一批 procurement 统一分流、统一执行、统一收集失败项,最后再决定抛给用户什么信息。本文结合 stock_rule.py 与 stock_orderpoint.py 把这条链路讲透。
从 Odoo 19 的 ORM 源码出发,讲清 flush_model、invalidate_model、modified 各自解决什么问题,以及为什么你一旦直接写 SQL,就必须主动把 ORM 世界和数据库世界重新对齐。
从 Odoo 19 源码出发,讲清一次访问为什么会先过 ACL、再过记录规则,以及 sudo 和 allowed_company_ids 为什么会让同一段代码在不同环境下表现完全不同。
account_budget 的预算行不是静态台账,而是把预算期间、分析账户和实际发生额查询拼成一条可重复计算链。真正会影响结果的,是 `_compute_all()`、`_compute_theoritical_amount()`