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代码部分尚未解析。

openerp child_of操作符深度解析

时间: 2024-08-06 16:05:25

openerp child_of操作符深度解析的相关文章

js的new操作符深度解析

引言 我们都知道new操作符在js中一般是用来创建一个构造函数的实例,它在创建实例具体做了什么,MDN文档是这么说的: 我一开始看到,完全没有任何的头绪和理解,到底什么意思,后面通过上网查阅了大量的资料,对new操作符有了初步的认识. 1.创建一个空的简单JavaScript对象(即{}): 2.链接该对象(即设置该对象的构造函数)到另一个对象 : 3.将步骤1新创建的对象作为this的上下文 : 4.如果该函数没有返回对象,则返回this. 普通函数和构造函数的区别 在js中 普通函数和构造函

第三十七课、深度解析QMap与QHash

一.QMap深度解析 1.QMap是一个以升序键顺序存储键值对的数据结构 (1)QMap原型为class QMap<K, T>模板 (2).QMap中的键值对根据key进行了排序 (3).QMap中的key类型必须重载operator <     (小于操作符) 2.QMap使用实例一 3.QMap使用实例二 4.QMap的注意事项 (1).通过key获取Value时 A.当key存在,返回对应的Value B.当key不存在,返回值类型所对应的"零"值 (2).插入

第37课 深度解析QMap与QHash

1. QMap深度解析 (1)QMap是一个以升序键顺序存储键值对的数据结构 ①QMap原型为 class QMap<K, T>模板 ②QMap中的键值对根据Key进行了排序 ③QMap中的Key类型必须重载operator< .(即“小于”操作符) (2)QMap使用示例1 QMap<QString, int> map; //注意插入时是无序的 map.insert("key 2", 2); map.insert("key 0", 0

Kafka深度解析

Kafka深度解析 原创文章,转载请务必将下面这段话置于文章开头处(保留超链接).本文转发自Jason's Blog,原文链接 http://www.jasongj.com/2015/01/02/Kafka深度解析 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能 高吞吐率.即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输 支持Kafk

数据库深度解析 | 从NoSQL历史看未来

数据库深度解析 | 从NoSQL历史看未来 http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=209753217&idx=1&sn=d3a021a7bd959cbf92ffc658336b2387&scene=1&srcid=fWEZMjyaJKjZo5wrpSiB&from=singlemessage&isappinstalled=0#rd 本文根据王晶昱(花名沈询)老师在“高可用架构”微信群

Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN

http://m.blog.csdn.net/blog/wu010555688/24487301 本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep learning简介 [2]Deep Learning训练过程 [3]Deep Learning模型之:CNN卷积神经网络推导和实现 [4]Deep Learning模型之:CNN的反向求导及练习 [5]Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN [6]Deep Learn

AndroidService 深度解析(2)

AndroidService 深度解析(2) 上一篇文章我们对Service的生命周期进行了测试及总结.这篇文章我们介绍下绑定运行的Service的实现. 绑定运行的Service可能是仅为本应用提供服务,称为本地Service:也可能为其他应用提供跨进程服务,即远程Service.下面分别进行介绍: 本地Service 如果Service只服务于本应用,那么我们只需要继承Binder类,定义我们需要实现的方法即可,当发起绑定连接时,Service将会在onBind方法中返回这个继承类的对象,使

SpringMVC 源代码深度解析&lt;context:component-scan&gt;(扫描和注册的注解Bean)

我们在SpringMVC开发项目中,有的用注解和XML配置Bean,这两种都各有自己的优势,数据源配置比较经常用XML配置,控制层依赖的service比较经常用注解等(在部署时比较不会改变的),我们经常比较常用的注解有@Component是通用标注,@Controller标注web控制器,@Service标注Servicec层的服务,@Respository标注DAO层的数据访问.SpringMVC启动时怎么被自动扫描然后解析并注册到Bean工厂中去(放到DefaultListableBeanF

深度解析数据分析对排名的决定作用(一)

深度解析数据分析对排名的决定作用(一) seo学习笔记摘要: 通过站点数据,更加放便我们了解站点的健康度,看出站点与用户之间的黏度,准确定位站点问题,及时的进行调整定制新的优化计划,让关键词排名更加稳定. 首先大家探讨核心数据分析,    做seo的一般会有这两个迷茫区: 1,不知道从哪開始,全部SEO优化基于数据分析開始.数据会告诉我们用户行为,页面好与坏. 2,做排名过程中不知道自己做的对不正确. 大家常看IP  PV  跳出率  页面点击图 今天SEO研究中心和大家讲用户数据,仅仅实用户数