child_of 

此操作符,从代码来看,等价于:

[('x','child_of',id)] ==>  x.prarent_left >=id.parent_left && x.parent_left <= id.parent_right , 求x(的集合)。 为了形象的说明,我们一步步来:

首先,模型定义里面必需要有parent_left / parent_right ,才支持在这个模型上执行 child_of 操作(odoo硬编码,不要问我为什么),如下:

model

'parent_left': ....,

'parent_right':...,

)

定义了之后,必需有其他模型many2one到此模型,假设模型A m2o 到 model,这个字段叫做 model_id,那么可以在A上用 [('model_id','child_of',id)] 得到一个A的model_id是以上x的集合的A的对象集合。这么说有些拗口,我们看看例子。

openerp中恰好有不少例子,producct.category 和 product.product就分别对应上面的model和A。

product.product 有一个字段m2o到 product.category,这个字段叫做 categ_id,如下

在仓库/产品/产品类别 中,我们可以点击一个类别,进入对应的产品列表,这就是一个child_of的实例, 其表达式是 [('categ_id','child_of',context['search_default_categ_id'])],如下:

这个表达式用在引用模型A上,此处是product.product。得到的结果就是一个product list, 其categ_id满足表达式:

[('categ_id','child_of',id)] ==>  categ_id.prarent_left >=id.parent_left && categ_id.parent_left <= id.parent_right , 求categ_id(的集合)。

得到[categ_id]后,再用 product.categ_id in [categ_id]进行过滤。

parent_left / parent_righ

首先,这两玩意是硬编码支持child_of运算的,没啥好说,位于:openerp/osv/expression.py (703 ~ 724)

是通用父子关系的一种硬编码。工作原理:采用数轴包含关系来区分父子。如下图:

添加子节点算法:

第一句,把邻居的左脚统一右移

第二句,把长辈和邻居的右脚统一右移

最后,自己占沙发

删除算法则相反。

以上,py代码部分完。js代码部分尚未解析。

后来,无意中发现,原来这个算法还是有些来头的,名为MPTT(modified preordered tree traversal),可以参考下这里。http://www.sitepoint.com/hierarchical-data-database-2/

转载于:https://www.cnblogs.com/Tommy-Yu/p/odoo_child_of.html

openerp child_of操作符深度解析相关推荐

  1. 深度解析javaScript常见数据类型检查校验

    前言 在JavaScript中,数据类型分为两大类,一种是基础数据类型,另一种则是复杂数据类型,又叫引用数据类型 基础数据类型:数字Number 字符串String 布尔Boolean Null Un ...

  2. 《C语言内核深度解析》——笔记及拓展(1)

    文章是我前几天读了朱有鹏,张先凤老师的<嵌入式Linux与物联网软件开发:C语言内核深度解析>写的,拜读之后,虽没有醍醐灌顶,至少解开了我之前的一些疑惑. <嵌入式Linux与物联网 ...

  3. 深度解析QMap与QHash

    一.QMap深度解析 1.QMap是一个以升序键顺序存储键值对的数据结构 (1)QMap原型为class QMap<K, T>模板 (2).QMap中的键值对根据key进行了排序 (3). ...

  4. 【C/C++ POD 类型】深度解析C++中的POD类型:从理论基础到项目实践

    深度解析C++中的POD类型:从理论基础到项目实践 1. C++中的POD类型(Plain Old Data) 1.1 POD类型的定义和特性 Trivial类型 Standard layout类型 ...

  5. 单文件浏览器_图文并茂深度解析浏览器渲染原理,包看懂超值得收藏

    在我们面试过程中,面试官经常会问到这么一个问题,那就是从在浏览器地址栏中输入URL到页面显示,浏览器到底发生了什么?这个问题看起来是老生常谈,但是这个问题回答的好坏,确实可以很好的反映出面试者知识的广 ...

  6. 舒工深度解析不规则场地座位二维码生成规则

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  7. 今晚8点开播 | 深度解析知识图谱发展关键阶段技术脉络

    作为知识图谱领域形成过程的亲历者之一,AI科技大本营此次邀请到文因互联 CEO 鲍捷,他将对知识图谱的历史渊源进行梳理,对该领域几次发展的主要技术突破做深度解析,并分析其工业落地的几个关键点.欢迎大家 ...

  8. 多目标跟踪算法FairMOT深度解析

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨周威@知乎 来源丨https://zhuanlan.zhihu.com/p/259356109 ...

  9. 深度解析工业软件:研究框架(140页)

    来源:跨越鸿沟 本文多图,建议阅读6分钟. 本文为你深度解析工业软件:研究框架 工业软件的核心,不仅是"软件",更是"工业". 有什么样的工业流程,就有什么样的 ...

最新文章

  1. idea tomcat热部署_IDEA设置热部署
  2. 事件冒泡和捕获的执行顺序
  3. java程序并行机制_Java语言具有多种优点和特点,下列选项中,______反映了Java程序并行执行机制的特点。A.多线程B.健...
  4. php 打开pdf文件附件,pdf里怎么链接到附件
  5. Win2003 IIS下,ASP.NET无法访问数据库和网页
  6. 祝融号火星车亮相,每小时仅移动40米,为何比乌龟还慢?
  7. JetBrains系列WebStorm等中文输入法无法跟随光标的问题的解决办法
  8. Javascript第六章闭包closure规则第三课
  9. 微信支付android错误码-1,安卓调用微信支付一直都是-1的错误,求问怎么解决
  10. 性能测试中的jvm监控
  11. Vue开发环境搭建 VsCode
  12. DSP ADC模数转换
  13. Javascript设计模式-18-状态模式
  14. O2O电子商务 营销模式
  15. Android监听蓝牙与设备连接状态、关闭和打开状态
  16. python根据题库答案自动答题_Selenium实现百度自动答题 懒人获取积分
  17. 3dMax 导出材质球
  18. 大数据学情分析_大数据背景下的大学生学情分析研究
  19. 基于Python的时间序列异常值检测
  20. attachment.php是什么,attachment是什么意思

热门文章

  1. document.createelement如何绑定点击事件_番外篇-EXCEL如何使用宏(VBA)
  2. 855计算机应用基础,2017年曲阜师范大学信息技术与传播学院855计算机应用基础考研导师圈点必考题汇编...
  3. # 解析bt文件_BT、磁力链这些词语是什么意思?
  4. 百度-Java中级面试题分享-
  5. linux redis 启动用户,redis 进程使用root用户启动 -- 整改方案
  6. requests由于系统缓冲区空间不足_系统C盘满了空间不足的扩容?
  7. windows查看linux文件中文,Linux 系统下无法查看Windows 中创建的中文文件名
  8. java hash取余_为什么Java的hash表的长度一直是2的指数次幂?为什么这个(hash(h-1)=hash%h)位运算公式等价于取余运算?...
  9. 多个数据文件 mysql_mysql多实例(多个配置文件方式)
  10. gis根据行政区计算栅格数据计算_亚马逊fba运费根据什么计算?怎么计算?