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 ,才支持在這個模型上執(zhí)行 child_of 操作(odoo硬編碼,不要問我為什么),如下:
model
(
'parent_left': ....,
'parent_right':...,
)
定義了之后,必需有其他模型many2one到此模型,假設(shè)模型A m2o 到 model,這個字段叫做 model_id,那么可以在A上用 [('model_id','child_of',id)] 得到一個A的model_id是以上x的集合的A的對象集合。這么說有些拗口,我們看看例子。
openerp中恰好有不少例子,producct.category 和 product.product就分別對應(yīng)上面的model和A。
product.product 有一個字段m2o到 product.category,這個字段叫做 categ_id,如下
?
在倉庫/產(chǎn)品/產(chǎn)品類別 中,我們可以點擊一個類別,進(jìn)入對應(yīng)的產(chǎn)品列表,這就是一個child_of的實例, 其表達(dá)式是 [('categ_id','child_of',context['search_default_categ_id'])],如下:
?
這個表達(dá)式用在引用模型A上,此處是product.product。得到的結(jié)果就是一個product list, 其categ_id滿足表達(dá)式:
[('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]進(jìn)行過濾。
?
parent_left / parent_righ
首先,這兩玩意是硬編碼支持child_of運算的,沒啥好說,位于:openerp/osv/expression.py (703 ~ 724)
是通用父子關(guān)系的一種硬編碼。工作原理:采用數(shù)軸包含關(guān)系來區(qū)分父子。如下圖:
?
添加子節(jié)點算法:
第一句,把鄰居的左腳統(tǒng)一右移?
第二句,把長輩和鄰居的右腳統(tǒng)一右移?
最后,自己占沙發(fā)
刪除算法則相反。
?
以上,py代碼部分完。js代碼部分尚未解析。
?
后來,無意中發(fā)現(xiàn),原來這個算法還是有些來頭的,名為MPTT(modified preordered tree traversal),可以參考下這里。http://www.sitepoint.com/hierarchical-data-database-2/
轉(zhuǎn)載于:https://www.cnblogs.com/Tommy-Yu/p/odoo_child_of.html
總結(jié)
以上是生活随笔為你收集整理的openerp child_of操作符深度解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU 1108 最小公倍数
- 下一篇: eclipse中对单独JS文件取消报错的