Many2many / One2many 命令不是玄学:Command.create、link、set 到底会改什么?
Odoo 的 x2many 写法常被记成一串“0 到 6”的魔法数字,但真正难点不是背数字,而是搞清它们在 one2many 和 many2many 上的语义并不完全相同。结合 commands.py 与 fields_relational.py,本文把 create、update、delete、unlink、link、clear、set 的真实效果一次讲透。
ARTICLE LIBRARY
持续记录源码理解、业务流程、模块开发经验与踩坑总结。
Odoo 的 x2many 写法常被记成一串“0 到 6”的魔法数字,但真正难点不是背数字,而是搞清它们在 one2many 和 many2many 上的语义并不完全相同。结合 commands.py 与 fields_relational.py,本文把 create、update、delete、unlink、link、clear、set 的真实效果一次讲透。
很多人以为 compute 方法一跑,store=True 字段就会立刻写回数据库。但从 Odoo ORM 源码看,真实机制是“先标记待重算,再在合适时机批量 recompute”。理解 tocompute、precompute、flush 和 _recompute_field,才能真正看懂为什么某些值看起来会“晚一步”。
看懂 ir.ui.view 如何把继承链拼成最终 arch,为什么 XPath 找不到、position 失效,往往不是 Odoo 随机坏了。
从 product.template.purchase_method、qty_received、qty_to_invoice 和 invoice_status,拆开看采购开票到底按谁算。
从预览、字段猜测到真正落库,拆开看 base_import 如何把一份外部文件变成可导入的 ORM 数据。
读懂 ir.cron 如何抢锁、分批执行、提交进度和重调度,才能避免把长任务写成一次性炸库。