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/
openerp child_of操作符深度解析的更多相关文章
- js的new操作符深度解析
引言 我们都知道new操作符在js中一般是用来创建一个构造函数的实例,它在创建实例具体做了什么,MDN文档是这么说的: 我一开始看到,完全没有任何的头绪和理解,到底什么意思,后面通过上网查阅了大量的资 ...
- 第37课 深度解析QMap与QHash
1. QMap深度解析 (1)QMap是一个以升序键顺序存储键值对的数据结构 ①QMap原型为 class QMap<K, T>模板 ②QMap中的键值对根据Key进行了排序 ③QMap中 ...
- Flink 源码解析 —— 深度解析 Flink 是如何管理好内存的?
前言 如今,许多用于分析大型数据集的开源系统都是用 Java 或者是基于 JVM 的编程语言实现的.最着名的例子是 Apache Hadoop,还有较新的框架,如 Apache Spark.Apach ...
- 《C++深度解析》课程目录
<C++深度解析>课程目录 第1课 - 学习 C++ 的意义 第2课 - C到C++的升级 第3课 - 进化后的const分析 第4课 - 布尔类型和引用 第5课 - 引用的本质分 ...
- 深度解析javaScript常见数据类型检查校验
前言 在JavaScript中,数据类型分为两大类,一种是基础数据类型,另一种则是复杂数据类型,又叫引用数据类型 基础数据类型:数字Number 字符串String 布尔Boolean Null Un ...
- [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析
[WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285 ...
- Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
http://m.blog.csdn.net/blog/wu010555688/24487301 本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep le ...
- (转载)(收藏)OceanBase深度解析
一.OceanBase不需要高可靠服务器和高端存储 OceanBase是关系型数据库,包含内核+OceanBase云平台(OCP).与传统关系型数据库相比,最大的不同点, 是OceanBase是分布式 ...
- Kafka深度解析
本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/2015/01/02/Kafka深度解析 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅 ...
随机推荐
- docker网络基础配置
常用两种方式: 1)映射容器端口到宿主机 2)容器互联机制 --------------------------------------------- 端口映射实现访问容器的用法: docker ru ...
- js无间隙滚动
代码一: ; //设置文字滚动速度 dome2.innerHTML=dome1.innerHTML //复制dome1为dome2 function Marquee(){ ) //当滚动至dome1与 ...
- 第一次使用Android Studio时你应该知道的一切配置
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Linux下MySQL忘记密码
系统:CentOS6.6 64位 参考文档(截图请看原网址): Linux下MySQL忘记root密码怎么办_百度经验 http://jingyan.baidu.com/article/1709ad8 ...
- 性能工具MiniProfiler在Asp.Net WebForm跟踪EntityFramework
http://www.xuebuyuan.com/356638.html 选择MiniProfiler.EF 默认会把MiniProfiler安装上,笔者程序是Asp.Net WebForm 不需要安 ...
- Python之路【第三篇】:Python基础(二)
函数的理解 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 函数作用是你的程序有良好的扩展性.复用性. 同样的功能要是用3次以上的话就建议 ...
- java编程中Properties类的具体作用和使用
如果不熟悉 java.util.Properties类,那么现在告诉您它是用来在一个文件中存储键-值对的,其中键和值是用等号分隔的.(如清单 1 所示).最近更新的java.util.Properti ...
- [译]bare repository
git init --bare 使用--bare创建的repository没有工作目录, 在这个repository中不能修改文件和commit. 中心repository必须是bare reposi ...
- noip2012 疫情控制
[问题描述] H国有n个城市,这n个城市用n-1条双向道路相互连通构成一棵树,1号城市是首都,也是树中的根节点. H国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边境城市(叶子 ...
- PHP 文件与文件夹的创建和删除操作
创建文件夹: mkdir("D:/test");可以创建多级目录,如果存在,则会报错 if(!is_dir($path)) { if(mkdir($path)){ ...