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是一种分布式的,基于发布/订阅 ...
随机推荐
- nginx使用ssl模块配置支持HTTPS访问
默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译nginx时指定–with-http_ssl_module参数. 需求: 做一个网站域名为 www.localhost.cn 要求通过htt ...
- linux下svn的命令
原文地址:http://www.cnblogs.com/wanqieddy/archive/2011/06/09/2076783.html
- 使用idea开发Springmvc
使用IntelliJ IDEA开发SpringMVC网站(一)开发环境 http://my.oschina.net/gaussik/blog/385697?fromerr=A4EKE0Ix idea1 ...
- nodejs 相关
1.错误 fs.js:543 return binding.rename(pathModule._makeLong(oldPath), 上传图片->图片改名->保存->在页面显示该图 ...
- jsp应用
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- HighCharts选项和参数详细配置查询表
概述:作为一款出色的交互图表制作工具,HighCharts有着全面的选项.参数等配置信息.为了帮助大家进一步掌握HighCharts,今天我们为大家整理了HighCharts的所有配置信息和说明,将其 ...
- 编写更好的C#代码
引言 开发人员总是喜欢就编码规范进行争论,但更重要的是如何能够在项目中自始至终地遵循编码规范,以保证项目代码的一致性.并且团队中的所有人都需要明确编码规范所起到的作用.在这篇文章中,我会介绍一些在我多 ...
- 包介绍 - UriTemplates (用于处理格式化Uri模板)
UriTemplates 用于处理格式化Uri模板 PM> Install-Package Tavis.UriTemplates 设置Uri Path Segment [Fact] public ...
- IIS 您要访问的网页有问题,无法显示!
提示:您要访问的网页有问题,无法显示.HTTP 500 – 内部服务器错误.”的问题解决方案! IIS服务器出现错误的原因很多,请尝试以下操作:1.查看网站属性——文档看看启用默认文档中是否存在:in ...
- Google Protocol Buffer 简单介绍
以下内容主要整理自官方文档. 为什么使用 Protocol Buffers .proto文件 Protocol Buffers 语法 编译.proto文件 Protocol Buffers API 枚 ...