openerp child_of操作符深度解析
child_of?
此操作符,從代碼來(lái)看,等價(jià)于:
[('x','child_of',id)] ==> ?x.prarent_left >=id.parent_left && x.parent_left <= id.parent_right , 求x(的集合)。 為了形象的說(shuō)明,我們一步步來(lái):
首先,模型定義里面必需要有parent_left / parent_right ,才支持在這個(gè)模型上執(zhí)行 child_of 操作(odoo硬編碼,不要問(wèn)我為什么),如下:
model
(
'parent_left': ....,
'parent_right':...,
)
定義了之后,必需有其他模型many2one到此模型,假設(shè)模型A m2o 到 model,這個(gè)字段叫做 model_id,那么可以在A上用 [('model_id','child_of',id)] 得到一個(gè)A的model_id是以上x的集合的A的對(duì)象集合。這么說(shuō)有些拗口,我們看看例子。
openerp中恰好有不少例子,producct.category 和 product.product就分別對(duì)應(yīng)上面的model和A。
product.product 有一個(gè)字段m2o到 product.category,這個(gè)字段叫做 categ_id,如下
?
在倉(cāng)庫(kù)/產(chǎn)品/產(chǎn)品類別 中,我們可以點(diǎn)擊一個(gè)類別,進(jìn)入對(duì)應(yīng)的產(chǎn)品列表,這就是一個(gè)child_of的實(shí)例, 其表達(dá)式是 [('categ_id','child_of',context['search_default_categ_id'])],如下:
?
這個(gè)表達(dá)式用在引用模型A上,此處是product.product。得到的結(jié)果就是一個(gè)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)行過(guò)濾。
?
parent_left / parent_righ
首先,這兩玩意是硬編碼支持child_of運(yùn)算的,沒(méi)啥好說(shuō),位于:openerp/osv/expression.py (703 ~ 724)
是通用父子關(guān)系的一種硬編碼。工作原理:采用數(shù)軸包含關(guān)系來(lái)區(qū)分父子。如下圖:
?
添加子節(jié)點(diǎn)算法:
第一句,把鄰居的左腳統(tǒng)一右移?
第二句,把長(zhǎng)輩和鄰居的右腳統(tǒng)一右移?
最后,自己占沙發(fā)
刪除算法則相反。
?
以上,py代碼部分完。js代碼部分尚未解析。
?
后來(lái),無(wú)意中發(fā)現(xiàn),原來(lái)這個(gè)算法還是有些來(lái)頭的,名為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操作符深度解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HDU 1108 最小公倍数
- 下一篇: VS的一部分快捷键