openerp child_of操作符深度解析
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操作符深度解析相关推荐
- 深度解析javaScript常见数据类型检查校验
前言 在JavaScript中,数据类型分为两大类,一种是基础数据类型,另一种则是复杂数据类型,又叫引用数据类型 基础数据类型:数字Number 字符串String 布尔Boolean Null Un ...
- 《C语言内核深度解析》——笔记及拓展(1)
文章是我前几天读了朱有鹏,张先凤老师的<嵌入式Linux与物联网软件开发:C语言内核深度解析>写的,拜读之后,虽没有醍醐灌顶,至少解开了我之前的一些疑惑. <嵌入式Linux与物联网 ...
- 深度解析QMap与QHash
一.QMap深度解析 1.QMap是一个以升序键顺序存储键值对的数据结构 (1)QMap原型为class QMap<K, T>模板 (2).QMap中的键值对根据key进行了排序 (3). ...
- 【C/C++ POD 类型】深度解析C++中的POD类型:从理论基础到项目实践
深度解析C++中的POD类型:从理论基础到项目实践 1. C++中的POD类型(Plain Old Data) 1.1 POD类型的定义和特性 Trivial类型 Standard layout类型 ...
- 单文件浏览器_图文并茂深度解析浏览器渲染原理,包看懂超值得收藏
在我们面试过程中,面试官经常会问到这么一个问题,那就是从在浏览器地址栏中输入URL到页面显示,浏览器到底发生了什么?这个问题看起来是老生常谈,但是这个问题回答的好坏,确实可以很好的反映出面试者知识的广 ...
- 舒工深度解析不规则场地座位二维码生成规则
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...
- 今晚8点开播 | 深度解析知识图谱发展关键阶段技术脉络
作为知识图谱领域形成过程的亲历者之一,AI科技大本营此次邀请到文因互联 CEO 鲍捷,他将对知识图谱的历史渊源进行梳理,对该领域几次发展的主要技术突破做深度解析,并分析其工业落地的几个关键点.欢迎大家 ...
- 多目标跟踪算法FairMOT深度解析
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨周威@知乎 来源丨https://zhuanlan.zhihu.com/p/259356109 ...
- 深度解析工业软件:研究框架(140页)
来源:跨越鸿沟 本文多图,建议阅读6分钟. 本文为你深度解析工业软件:研究框架 工业软件的核心,不仅是"软件",更是"工业". 有什么样的工业流程,就有什么样的 ...
最新文章
- idea tomcat热部署_IDEA设置热部署
- 事件冒泡和捕获的执行顺序
- java程序并行机制_Java语言具有多种优点和特点,下列选项中,______反映了Java程序并行执行机制的特点。A.多线程B.健...
- php 打开pdf文件附件,pdf里怎么链接到附件
- Win2003 IIS下,ASP.NET无法访问数据库和网页
- 祝融号火星车亮相,每小时仅移动40米,为何比乌龟还慢?
- JetBrains系列WebStorm等中文输入法无法跟随光标的问题的解决办法
- Javascript第六章闭包closure规则第三课
- 微信支付android错误码-1,安卓调用微信支付一直都是-1的错误,求问怎么解决
- 性能测试中的jvm监控
- Vue开发环境搭建 VsCode
- DSP ADC模数转换
- Javascript设计模式-18-状态模式
- O2O电子商务 营销模式
- Android监听蓝牙与设备连接状态、关闭和打开状态
- python根据题库答案自动答题_Selenium实现百度自动答题 懒人获取积分
- 3dMax 导出材质球
- 大数据学情分析_大数据背景下的大学生学情分析研究
- 基于Python的时间序列异常值检测
- attachment.php是什么,attachment是什么意思
热门文章
- document.createelement如何绑定点击事件_番外篇-EXCEL如何使用宏(VBA)
- 855计算机应用基础,2017年曲阜师范大学信息技术与传播学院855计算机应用基础考研导师圈点必考题汇编...
- # 解析bt文件_BT、磁力链这些词语是什么意思?
- 百度-Java中级面试题分享-
- linux redis 启动用户,redis 进程使用root用户启动 -- 整改方案
- requests由于系统缓冲区空间不足_系统C盘满了空间不足的扩容?
- windows查看linux文件中文,Linux 系统下无法查看Windows 中创建的中文文件名
- java hash取余_为什么Java的hash表的长度一直是2的指数次幂?为什么这个(hash(h-1)=hash%h)位运算公式等价于取余运算?...
- 多个数据文件 mysql_mysql多实例(多个配置文件方式)
- gis根据行政区计算栅格数据计算_亚马逊fba运费根据什么计算?怎么计算?