Odoo shell 提供了一個簡便的操作 Odoo的交互界面, 從 odoo 9.0 開始就是標準功能, 無需安裝第三方應用。
? ?
本文基于Odoo10 說明 Odoo Shell以及 Odoo ModelClass 、Model、model、recordset 之間的關系 [注意:大小寫是有特殊含義]
? ?
Odoo Shell是 通過在 cli/command.py#commands{} 注冊 Shell command 來實現的。
首先,Odoo支持的 command 都是基于 command 基類,而 command 基類 則通過 在 它的 元類 初始化的時候, 往 commands{} 注冊支持的 command.
? ?
? ?
? ?
而 Shell command.
? ?
? ?
而從 Odoo 10 開始, Shell 支持 多種 終端,通過參數shell-interface 傳遞給Odoo shell,支持以下終端類型
- ipython
- ptpython
- bpython
- python,如果不指定,則使用Python
? ?
運行 Odoo shell
執行 命令 python odoo-bin shell -c ..\t.conf --shell-interface ipython
以 ipython 交互界面 運行 Odoo shell. 啟動之后
出現 ipython 終端提示符
? ?
Odoo shell啟動之后,只提供了 以下幾個變量
變量 | 類型 |
env | odoo.api.Environment 對象 |
odoo | odoo 模塊 |
openerp | odoo 模塊 |
self | res.users(1,) 記錄 |
?? | ?? |
? ?
registry 是 Odoo實例維護的信息中心,可以通過 env.registry 獲取
? ?
通過 env.registry.models 可以 獲取當前 Odoo實例 的模型列表, 它返回的結果是,ModelClass 和 Model 字典鍵值對,例如
? ?
查看下 常用的 模型,例如 product.product
product.product 是 ModelClass ; 而 odoo.api.product.product 則是 Model
? ?
? ?
也可以通過 env['product.product'] 獲取 Model
而這個 Model 本身就是 odoo.api.product.product
? ?
再開看看 odoo.api.product.product 的基類
? ?
從注冊表 獲取 odoo.api.product.product 對應的 Model Class, 發現 product.product 是在所有 定義/擴展過 product.product 模型的 模型基礎上 再組裝出來的。
?
? ?
Odoo Shell 操作 Odoo 記錄
? ?
查詢產品
env['product.product'].search([])
? ?
? ?
遍歷查看產品的名稱
for prod in env['product.product'].search([]):
print prod.name
? ?
? ?
修改產品的屬性
? ?
例如修改 id = 1 產品的名稱
? ?
只要能取得模型,模型的一切方法都能調用, 標準的方法
方法 | 必要參數 | 選參 |
search | domain | ?? |
search_count | domain | ?? |
search_read | domain | ?? |
browse | ?? | ?? |
copy | ?? | ?? |
copy_data | ?? | ?? |
create | ?? | ?? |
default_get | ?? | ?? |
name_get | ?? | ?? |
read | ?? | ?? |
read_group | ?? | ?? |
unlink | ?? | ?? |
write | ?? | ?? |
update | vals 字典 | ?? |
? ?
提示
Odoo 的模型其實是 轉包過一次的,并不是 product.product,而是 odoo.api.product.product 而且 Model 是 通過 Model Class 來進行實例化出來的。
嚴格意義上來講,在寫Odoo 模型Model 時,其實是在 寫 Model Class 的父類, 最終這些 父類會 匯總 派生出 Model Class,進而實例化為 model,而recordset 也是 Model Class 衍生出來的
Odoo Shell
技術