Odoo层次结构(parent_left,parent_right)处理原理
Odoo中很多层次结构表,如库位表(stock.location)、Partner表、包裹(stock.operation.package)等表,都有一个parent_id字段指示其上级记录。为了提高层次结构(树状结构)的处理效率,系统中还另外增加了两个字段(parent_left,parent_right),用于快速遍历树状节点。详细原理可以参考这里:之前的《数据库中存储层级结构算法解析》。
Odoo中child_of操作符充分利用字段(parent_left,parent_right),快速返回下级记录(包括儿子、孙子)。由于种种原因,系统中字段(parent_left,parent_right)有时候会错乱,child_of不能正确取值,导致一系列奇怪问题。常见问题是,明明有库存,却总是不能保留出库(原因是库位的parent_left,parent_right错乱了)。
<hr/>
具体解决办法
Odoo中parent_left维护着树状结构前序遍历的顺序,parent_right总是等于parent_left加上子节点数的两倍再加1。没有子节点的,parent_right=parent_left+1,2个子节点的,parent_right=parent_left+4+1。如下图所示的库位表结构。
Odoo中child_of的实现原理是,一个节点的所有下级节点的条件是:parent_left大于当前节点的parent_left,parent_right小于当前节点的parent_right的所有节点即为下级节点。如果parent_left,parent_right错乱了,child_of操作就不对,这会导致很多奇怪错误!
系统的basemodel有一个方法_parent_store_compute(),用于重算全表的parent_left,parent_right。如果parent_left,parent_right错乱了,可以写一个修正的ServerAction,一条语句:model._parent_store_compute(),执行它,重算一下parent_left,parent_right即OK。
文章编辑:开源智造(OSCG.CN)-源自欧洲,业界领先的免费开源ERP专业服务商
留言与评论(共有 0 条评论) |