日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

openerp child_of操作符深度解析

發(fā)布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 openerp child_of操作符深度解析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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到此模型,假設模型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,如下

?

在倉庫/產(chǎn)品/產(chǎn)品類別 中,我們可以點擊一個類別,進入對應的產(chǎn)品列表,這就是一個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)

是通用父子關系的一種硬編碼。工作原理:采用數(shù)軸包含關系來區(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/

轉載于:https://www.cnblogs.com/Tommy-Yu/p/odoo_child_of.html

總結

以上是生活随笔為你收集整理的openerp child_of操作符深度解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。