出库时的 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 拆行。
很多人理解记录规则时只记住一句话:ir.rule 会给 search 自动加 domain。这个说法不算错,但远远不够。到了新版本源码里,访问检查已经不再是“前面搜出来就算能操作”,而是模型权限先过一层、记录规则再过一层,最后才得到真正允许的记录集。本文结合 orm/models.py 把这条边界讲透。
很多人把 account.move.line 里的 display_type 误以为只是 UI 用来画 section 和 note 的字段。实际上,它同时决定一行是不是产品行、税行、付款条款行,甚至决定这行应不应该有科目、金额和后续会计语义。本文结合 account_move_line.py 与 account_move.py 把这条边界讲透。
结合 Odoo 19 ORM 与 website.page 源码,讲清 _inherit 和 _inherits 的根本区别:前者是在同一模型上加能力,后者是通过委托把父模型字段投影到子模型上,但数据仍存放在不同表里。
很多实施和开发同学都会遇到同一种困惑:列表里看得到,表单也能打开,但一保存就报权限错。结合 models.py 里的 _check_access 实现,这篇文章把 ACL、记录规则、操作类型和 sudo 的边界拆开讲清。
很多人调 Odoo 视图继承时,第一反应是 XPath 写错了。但从 ir_ui_view.py 的 locate_node、apply_inheritance_specs 与 _raise_view_error 看,真正的问题往往是目标节点在合并后的树里早就变形、换层、被前序扩展改过,或者 position 用错了。
不再泛讲 related 全景,而是围绕 test_orm 里的 foo_bar_sudo_id_name、foo_bar_id_name 等测试模型,说明 related_sudo 只决定当前 related 字段的求值语义,不等于后续再 related 的字段也自动跟着 sudo。