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 .. .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 衍生出来的