工具参考¶
v1.6.0 新增
仍然是 28 个工具(配置档 standard 下为 25 个)。
odoo_version增加一个plugin块:作出响应的 odoo-tools 版本,以及在 Claude Code 中它的已安装副本。参见odoo_version。- Odoo 10 至 12 上的
odoo_execute: 按位置传递给业务方法的对象中,既不是模型字段、也不是允许的上下文键的键会被拒绝(规则context)。参见odoo_execute。
v1.5.1 新增
工具列表没有变化:仍然是 28 个(配置档 standard 下为 25 个)。策略会把 odoo_execute 按位置传递的对象当作上下文来检查,因为 Odoo 10 至 12 会这样对待它(参见 已知限制 10)。这些工具只在 Claude Code 中运行;在 Cowork 和 Claude chat 中,/odoo-tools:odoo-doctor 会告诉你应该在哪里使用它们。
v1.5.0 新增
- 权限策略: 仍然是 28 个工具,但默认配置档
standard只列出 25 个:odoo_unlink、odoo_add_field和odoo_add_automation需要其他配置档。按名称调用一个被隐藏的工具会说明原因。参见 权限策略。 - Read-only mode 不再列出 9 个写入工具。
odoo_report已弃用: 它不调用 Odoo,直接返回错误,并将在 2.0.0 中移除。请使用odoo_record_documents。odoo_version返回policy块;odoo_access_check增加policy;odoo_list_models增加hidden_by_policy;odoo_online_profile会把策略扣留的部分报告在unavailable中。- 类凭据字段会从读取结果中移除,结果在
policy_withheld_fields中点名它们。 - 写入工具在其注解中声明
destructiveHint。 odoo_connections不再返回 URL 中的user:pass@。odoo_add_automation在 Odoo 10 上会填写base.action.rule的触发器字段kind。
v1.4.1 新增
工具没有变化:v1.4.1 是一个文档与诊断版本。这些工具只在 Claude Code 中可用(参见 适用环境)。
v1.4.0 新增
- 28 个工具(之前为 22 个):六个面向 Odoo Online 的工具,在任何 Odoo 10-19 上都可用。参见 Odoo Online。
odoo_execute接受顶层的ids,因此同一个调用在 JSON-2 和经典传输方式上都能工作。odoo_read_group自 saas~18.4 起使用formatted_read_group,并保留其参数和经典输出。odoo_version会在响应之前先登录,并在 Odoo 19+ 上添加transport_notice。
MCP 服务器暴露 28 个工具(19 个读取、9 个写入)。列出多少个取决于权限配置档:standard(默认)下为 25 个,readonly 或 Read-only mode 下为 19 个,builder 和 full 下为 28 个(参见 每个配置档列出的工具)。所有对模型的操作都会经过兼容层:你可以使用模型和字段的 现代 名称,服务器会将它们解析为目标版本中实际存在的内容。不可用的字段会连同一条 dropped_fields 警告被丢弃,而不会让整个调用失败。除非另有说明,这些工具通过 JSON-2、JSON-RPC 和 XML-RPC 的行为都相同。
在配置档 full 之外,类凭据字段(密码、令牌、密钥)会从读取结果中移除,结果会在 policy_withheld_fields 中点名它们。
写入工具
有九个工具会 修改数据 或可能产生副作用:odoo_create、odoo_write、odoo_unlink、odoo_execute、odoo_translate_set、odoo_add_field、
odoo_add_automation、odoo_import_preview 和 odoo_import。它们在下方标注为
写入。开启 Read-only mode(ODOO_READONLY=1)时,服务器不会列出它们,并会在访问 Odoo 之前拒绝所有这些工具。除此模式外,权限策略 会在 Odoo 用户的权限之上对每次调用做出决定(默认配置档 standard:不删除、不做 Studio 风格的改动、除内部备注外不发送外发邮件、不读取密钥)。公开核心 不 施加审批流程(那属于一个私有的治理层)。请使用最小权限用户,并审查每一次写入。它们的 MCP 注解声明了 destructiveHint:odoo_create、odoo_add_field 和 odoo_import_preview 为 false,其余为 true。
在 Odoo 10 至 12 中,在对 account.move 或 account.invoice 写入之前,请阅读 跨版本兼容性 中的警告:它们是不同的模型(会计凭证 vs. 发票),命名错误可能会写到语义不同的记录上。请显式命名正确的模型。
概览¶
| 工具 | 类型 | 作用 |
|---|---|---|
odoo_search |
读取 | 搜索并返回 id |
odoo_search_count |
读取 | 统计记录数 |
odoo_read |
读取 | 按 id 读取记录 |
odoo_search_read |
读取 | 一次调用完成搜索与读取 |
odoo_read_group |
读取 | 在服务器端分组与聚合(GROUP BY) |
odoo_export_records_json |
读取 | 导出为 JSON |
odoo_export_records_csv |
读取 | 导出为 CSV |
odoo_version |
读取 | 版本/版本类型/部署方式/传输方式 |
odoo_connections |
读取 | 活动会话 |
odoo_list_models |
读取 | 列出模型 |
odoo_fields_get |
读取 | 一个模型的字段(带缓存) |
odoo_module_info |
读取 | 一个模块的状态 |
odoo_telemetry_preview |
读取 | 显示 opt-in 遥测负载(从不发送) |
odoo_translate_get |
读取 | 读取一条翻译 |
odoo_report |
读取(已弃用) | 不调用 Odoo,直接返回错误;请使用 odoo_record_documents。将在 2.0.0 中移除 |
odoo_online_profile |
读取 | 版本系列与版本线、部署方式、传输方式、API keys 及其过期时间、Odoo Online 的限制 |
odoo_api_catalog |
读取 | 一个模型的方法及其参数名称 |
odoo_access_check |
读取 | 用户可以读取、写入、创建和删除什么,以及是否可以导出 |
odoo_record_documents |
读取 | 一条记录的附件和一张发票已保存的 PDF |
odoo_create |
写入 | 创建一条记录 |
odoo_write |
写入 | 更新记录 |
odoo_unlink |
写入 | 删除记录(配置档 builder 和 full) |
odoo_execute |
写入 | 调用模型的任意方法 |
odoo_translate_set |
写入 | 设置一条翻译 |
odoo_add_field |
写入 | 添加一个自定义字段(Studio 风格;配置档 builder 和 full) |
odoo_add_automation |
写入 | 创建一个自动化(Studio 风格;配置档 builder 和 full) |
odoo_import_preview |
写入 | 用 Odoo 的导入器预演一次导入,不保存 |
odoo_import |
写入 | 在一次原子调用中导入多行 |
读取与查询¶
odoo_search¶
搜索一个模型并返回匹配的 id。
| 参数 | 是否必需 | 类型 | 说明 |
|---|---|---|---|
model |
是 | string | 现代名称或历史名称 |
domain |
否 | array | Odoo 搜索域 |
limit / offset / order |
否 | 分页与排序 |
odoo_search_count¶
统计与某个域匹配的记录数(不获取数据)。
odoo_read¶
按 id 读取记录,可选择限定字段。
| 参数 | 是否必需 | 类型 |
|---|---|---|
model |
是 | string |
ids |
是 | 整数数组 |
fields |
否 | 字符串数组 |
odoo_search_read¶
一次调用完成搜索与读取:主要的查询工具。
| 参数 | 是否必需 | 类型 |
|---|---|---|
model |
是 | string |
domain、fields、limit、offset、order |
否 |
odoo_search_read {
"model": "account.move",
"domain": [["state","=","posted"]],
"fields": ["name","amount_total","invoice_date"],
"limit": 10, "order": "invoice_date desc"
}
odoo_read_group¶
在服务器端聚合(GROUP BY):由数据库完成分组与求和,而不是返回所有行。它适用于 Odoo 10 至 19,返回 { model, groups }。模型名称会被解析;fields 和 groupby 中的名称按原样传递。
在 saas~18.3 及之前,它使用经典的 read_group。自 saas~18.4 起,它在所有传输方式上都使用 formatted_read_group(19.0 弃用了经典的 read_group,而 Odoo Online saas~19.1 至 saas~19.4 没有它),并保留参数和经典输出:<groupby>_count / __count 键、__domain、lazy 分组时的 __context、带 __range 的日期标签,以及 orderby。没有默认聚合函数的字段会出现在 dropped_fields 中:请显式请求 字段:sum(或其他运算符)。自 Odoo 17.0 起,fields 的每个元素必须是 字段、字段:agg 或 名称:agg(字段);任何多余的文本都会在调用 Odoo 之前以 CompatError 被拒绝。
| 参数 | 是否必需 | 类型 | 说明 |
|---|---|---|---|
model |
是 | string | 现代名称或历史名称 |
fields |
是 | 字符串数组 | 分组字段加聚合,例如 "expected_revenue:sum" |
groupby |
是 | 字符串数组 | 例如 ["stage_id"] 或 ["invoice_date:month"] |
domain |
否 | array | Odoo 搜索域 |
limit / offset / orderby |
否 | 分组的分页与排序 | |
lazy |
否 | boolean | 默认 true:只按 groupby 的第一个字段分组 |
odoo_read_group { "model": "crm.lead", "fields": ["stage_id","expected_revenue:sum"], "groupby": ["stage_id"] }
odoo_export_records_json¶
将与某个域匹配的记录导出为 JSON 数组(只读)。参数与 odoo_search_read 相同。返回 { model, count, records }。
odoo_export_records_json { "model": "product.template", "fields": ["name","list_price"], "limit": 500 }
odoo_export_records_csv¶
与上一个相同,但返回 CSV 文本。many2one 值会被扁平化为其可见名称。返回 { model, count, columns, csv }。
odoo_export_records_csv { "model": "res.partner", "domain": [["customer_rank",">",0]], "fields": ["name","email","city"] }
元数据与内省¶
odoo_version¶
无参数。先登录,然后返回 version、raw_version、edition、deployment、当前生效的
transport(json2、jsonrpc、xmlrpc 或 jsonrpc(auto))以及 transport_notice:null,或在 Odoo 19+ 上说明为什么使用 /xmlrpc 或 /jsonrpc,以及如何切换到 JSON-2。
自 v1.5.0 起,它还增加 policy:配置档、文件、摘要(digest)、被隐藏的工具、开放项、警告(Odoo 用户是管理员时为 W10),或锁定策略的错误。策略被锁定时,它是唯一可用的工具,并且不联系 Odoo 就作出响应。参见 工具报告的内容。
自 v1.6.0 起,它还增加 plugin:作出响应的 odoo-tools 版本,以及在 Claude Code 中它的已安装副本,例如
{"name": "odoo-tools", "version": "1.6.0", "copy": "odoo-tools@transgenia-odoo-tools"}。安装了两个副本时,它会告诉你运行的是哪一个。策略被锁定时它也在。没有 policy 的响应来自早于 1.5.0 的副本:引导路线和 /odoo-tools:odoo-doctor 会在那里停止(参见 两个 odoo-tools 副本)。
odoo_connections¶
无参数。列出服务器上有活动会话的 Odoo 实例。自 v1.5.0 起,它会在所有配置档中从所报告的 URL 里去掉 Odoo 前面基本认证的 user:pass@。
odoo_list_models¶
列出模型,可选择按名称片段过滤。它会略去权限策略在其上不允许任何操作的模型,并在 hidden_by_policy 中返回数量。
| 参数 | 是否必需 | 类型 | 说明 |
|---|---|---|---|
like |
否 | string | 片段(不区分大小写) |
limit |
否 | integer | 默认 200 |
odoo_fields_get¶
返回一个模型的字段定义(带缓存)。它接受历史名称或现代名称。
| 参数 | 是否必需 | 类型 |
|---|---|---|
model |
是 | string |
attributes |
否 | 字符串数组 |
odoo_module_info¶
按技术名称获取一个模块的安装状态和元数据。
odoo_telemetry_preview¶
无参数。显示你可以分享的 opt-in 遥测负载的确切内容;遥测关闭时(默认,用 ODOO_TELEMETRY=opt-in 开启)返回 opted_in: false。只读:它从不传输任何内容。返回 { opted_in, payload, note }。参见 隐私。
odoo_translate_get¶
读取某条记录某个字段在特定语言下的值。
| 参数 | 是否必需 | 类型 | 说明 |
|---|---|---|---|
model |
是 | string | |
id |
是 | integer | |
field |
是 | string | |
lang |
是 | string | 例如 es_MX、en_US、zh_CN |
odoo_report(已弃用)¶
自 v1.5.0 起弃用;将在 2.0.0 中移除
odoo_report 总是不调用 Odoo 就返回错误。它使用的是私有方法 ir.actions.report._render_qweb_pdf,而 Odoo 在所有版本上都拒绝通过 RPC 调用它,因此它从来不可能成功。即使还没有配置连接,它也会这样说明,因为它从不请求会话。要获取 PDF,请使用 odoo_record_documents,它会返回 Odoo 已经保存的文档(例如发送或打印发票时生成的发票 PDF)。
它保留了自己的参数(report_name、ids),这样现有的调用会收到带有补救办法的错误,而不是参数校验错误。
写入 ¶
每次写入都要经过 权限策略:先在登录之前根据参数做出决定(A 层),然后工具发出的每个 Odoo 调用在发送时都会连同其值和路径再检查一次(B 层),包括其 x2many 命令所更改的记录。拒绝信息会点名配置档、规则以及改变它的方法。
odoo_create 写入¶
创建一条记录。返回新的 id。
| 参数 | 是否必需 | 类型 |
|---|---|---|
model |
是 | string |
values |
是 | object |
odoo_write 写入¶
按 id 更新记录。
| 参数 | 是否必需 | 类型 |
|---|---|---|
model |
是 | string |
ids |
是 | 整数数组 |
values |
是 | object |
odoo_unlink 写入¶
按 id 删除记录。在默认配置档 standard 下,它不会被列出,删除也会被拒绝:在模型有 active 字段的地方,请改用
odoo_write { ..., "values": { "active": false } } 归档。它在 builder(只在定制类模型上删除,除非策略文件开放了 unlink)和 full 下会被列出。
odoo_execute 写入¶
调用模型的任意公开方法(escape hatch)。它可能修改数据,因此 Read-only mode 会拒绝它。它不经过版本类型解析,因此请谨慎使用。
在权限策略下,odoo_execute 是 call 操作,再加上方法本身的类别(通过 odoo_execute 调用 unlink 就是一次删除)。读取数据的方法(search_read、read_group、web_search_read、onchange 等)会作为读取来检查,任何其他方法的结果都会被隐去。外发方法(发给联系人的 message_post、message_subscribe、send_mail 等)会被拒绝,除非它是一条内部备注(subtype_xmlid 为 "mail.mt_note" 且没有 partner_ids 的 message_post),或者策略文件为该模型列出了它们。只接受特定的上下文键,default_<字段> 的值另有限制:参见 上下文键。由于 Odoo 10 至 12 会把紧跟在方法参数之后、按位置传递的对象当作上下文,策略也会用这些规则检查它(参见 已知限制 10):请按名称在 kwargs 中传递上下文。自 v1.6.0 起,在 Odoo 10 至 12 上,按位置传递给业务方法的对象中,既不是模型字段、也不是允许的上下文键的键会被拒绝(规则 context);无法读取模型的字段时,调用会被拒绝(规则 unverified)。参见 内置规则。
| 参数 | 是否必需 | 类型 | 说明 |
|---|---|---|---|
model |
是 | string | |
method |
是 | string | |
ids |
否 | 整数数组 | 记录方法(write、unlink、copy、action_*)所针对的记录;对 search 或 create 这样的模型方法请省略 |
args |
否 | array | 位置参数(execute_kw 风格;记录方法的第一个参数是 id 列表) |
kwargs |
否 | object | 具名参数,例如 {"fields": ["name"]} |
ids + kwargs 的形式在所有传输方式上都可用,包括只接受具名参数的 JSON-2(Odoo 19+)。在 JSON-2 上,位置参数 args 会依据插件已知方法的对照表来命名;如果某个模型的重写使用了其他名称,Odoo 会在执行任何操作之前拒绝它,插件会修正名称,或在 auto 模式下通过 JSON-RPC/XML-RPC 发送这次调用。你在 kwargs 中传入的名称永远不会被更改。要了解参数名称,请使用 odoo_api_catalog。
odoo_translate_set 写入¶
为某个语言设置一个字段的翻译。在 Odoo 16+ 中使用原生 API
update_field_translations;在更早的版本中,则在语言上下文下写入该字段。兼容层会选择正确的路径。
| 参数 | 是否必需 | 类型 |
|---|---|---|
model |
是 | string |
id |
是 | integer |
field |
是 | string |
lang |
是 | string |
value |
是 | string |
odoo_translate_set { "model": "product.template", "id": 42, "field": "name", "lang": "en_US", "value": "Wireless mouse" }
odoo_add_field 写入¶
向一个模型添加自定义字段(Odoo Studio 风格,在 CE 和 EE 上都能工作)。它会创建一条手动的 ir.model.fields 记录(state='manual');名称会被强制加上必需的前缀 x_。需要配置档 builder 或 full(在 standard 下不会被列出)。参见 低代码定制。
| 参数 | 是否必需 | 类型 | 说明 |
|---|---|---|---|
model |
是 | string | 目标模型,例如 res.partner |
name |
是 | string | 字段名称;若缺少则自动加上 x_ |
label |
是 | string | 可见标签(field_description) |
field_type |
是 | string | char、text、html、boolean、integer、float、monetary、date、datetime、many2one、one2many、many2many、selection |
relation |
否 | string | 关系型类型的关联模型 |
relation_field |
否 | string | one2many 的反向字段 |
selection |
否 | array | 用于 selection:[值, 标签] 对的列表 |
required |
否 | boolean | 默认 false |
help |
否 | string | 帮助文本 |
odoo_add_field { "model": "res.partner", "name": "loyalty_points", "label": "Loyalty points", "field_type": "integer" }
odoo_add_automation 写入¶
创建一个自动化动作(Studio 风格),在模型的某个触发器上执行 server action 代码。Python 代码会在发送之前依据 Odoo 的 safe_eval 进行校验(在 Odoo online/SaaS
中至关重要)。它会适配目标版本的 base.automation 模式(在 Odoo 10 上为 base.action.rule,其触发器字段名为 kind;自 v1.5.0 起工具会填写它)。需要配置档 builder 或 full(在 standard 下不会被列出)。参见
低代码定制。
| 参数 | 是否必需 | 类型 | 说明 |
|---|---|---|---|
model |
是 | string | |
name |
是 | string | |
code |
是 | string | safe_eval 下的 Python:使用 env、model、record(s)、datetime...;在最后一行赋值 action = {...} 以返回一个动作 |
trigger |
否 | string | on_create、on_write、on_create_or_write(默认)、on_unlink |
filter_domain |
否 | array | 用于限定触发器的可选域 |
odoo_add_automation {
"model": "crm.lead",
"name": "Flag hot leads",
"trigger": "on_create_or_write",
"code": "for rec in records:\n if rec.probability and rec.probability > 80:\n rec.write({'priority': '3'})"
}
safe_eval
自动化代码在 Odoo 的 safe_eval 下运行:没有 import、def、class、return、with,不能访问以下划线或双下划线开头的名称/属性,也不能给属性赋值(rec.field = value 会编译为 STORE_ATTR 并被拒绝,请用 rec.write({...}))。工具会在发送之前拒绝这些结构。细节见 低代码定制。
Odoo Online(适用于任何 Odoo)¶
六个工具覆盖了 Odoo Online 数据库中难以处理的事项:没有自定义 Python、只有 Custom 计划才能访问 API、会过期的 API keys(18+)、每隔几个月就有一条新的 saas~X.Y 版本线、无法通过 RPC 渲染 PDF,以及把导入作为批量加载的正式途径。它们在任何 Odoo 10-19 上都可用,并按版本降级。在 Odoo Online 上,请控制批量工作的节奏:大约每秒 1 次调用,不要并行调用。
odoo_online_profile¶
无参数。一次读取即可得到:版本系列与版本线(19.0 或 saas~19.2)、部署方式及该检测的可信程度(deployment_confidence)、传输方式、JSON-2 和 Odoo 的 /doc-bearer 目录是否可用、弃用提示以及 /xmlrpc 和 /jsonrpc 何时消失、用户及其公司、2FA、用户的 API keys 及其过期时间(只有名称和日期,绝不包含 key 本身)、已安装的应用、已导入的数据模块、Studio,以及 Odoo Online 的限制(Custom 计划、大约每秒 1 次调用、每天 5 到 200 封邮件、仅限数据模块)。某个版本没有的项会返回 null。
Odoo 10-19;API keys 自 14 起,过期时间自 18 起。在 19.0 上,模块列表需要管理员权限。自 v1.5.0 起,权限策略扣留的部分会出现在 unavailable 中,而不会让工具失败。
odoo_api_catalog¶
一个模型的公开方法及其按顺序排列的参数名称,每个方法是否为模型级方法(不接收 ids)以及是否只读,用于 JSON-2 和 odoo_execute 的 ids + kwargs 形式。在 Odoo 19.0+ 上使用管理员的 API key 时,它读取该数据库自己的目录(/doc-bearer,按 ETag 缓存):该模型的确切名称,包括自定义方法和 Studio 方法。否则返回插件内置的对照表:自 saas~18.4 起为基础定义的名称(某个模型的重写可能会重命名某个参数),10.0 至 saas~18.3 则不含名称(parameters: null),此时 odoo_execute 使用位置参数 args。source 说明来源,note 说明原因。最多 100 个方法;字段请见 odoo_fields_get。
| 参数 | 是否必需 | 类型 | 说明 |
|---|---|---|---|
model |
是 | string | 技术名称,例如 res.partner |
method |
否 | string | 方法名称片段(不区分大小写) |
odoo_access_check¶
已登录用户(所配置凭据的所有者)在一个模型上可以做什么:读取、写入、创建和删除,以及 export_allowed(base.group_allow_export 组,Odoo 16+)。默认检查模型的访问权限;在 Odoo 18+ 上传入 ids 时,这些记录的记录规则也会计入。在 Odoo 18+ 上使用 has_access,在 10-17 上使用 check_access_rights。不会更改任何内容。自 v1.5.0 起,它还会在 Odoo 的回答旁边返回 policy(按权限策略得出的 {操作: true 或 false}),当 Odoo 允许某项策略拒绝的操作时,在 notes 中附上一条说明。
| 参数 | 是否必需 | 类型 | 说明 |
|---|---|---|---|
model |
是 | string | 技术名称,例如 sale.order |
operations |
否 | 字符串数组 | read、write、create、unlink;默认全部四种 |
ids |
否 | 整数数组 | 最多 1000 个 id,用于按记录检查(Odoo 18+) |
odoo_record_documents¶
列出一条记录的附件(id、名称、MIME 类型、字节大小、创建日期),并标出其主附件,以及在发票上(Odoo 17+)发票已保存的 PDF,后者在简单的附件搜索中不会显示。传入 attachment_id 和 include_content: true 时,还会以 base64 返回该文件,前提是它属于该记录且大小不超过 max_bytes。这是获取 PDF 的方法:这些工具不渲染报表(odoo_report 已弃用)。它返回 Odoo 已经保存的文档(例如发送或打印发票时生成的 PDF)。Odoo 10-19。它对 ir.attachment 的内部调用固定在所请求的记录上(参见
ir.attachment 固定到其父记录)。
| 参数 | 是否必需 | 类型 | 说明 |
|---|---|---|---|
model |
是 | string | 例如 account.move |
res_id |
是 | integer | 记录的 id |
attachment_id |
否 | integer | 该记录的一个附件(列表中的一个 id) |
include_content |
否 | boolean | 默认 false;以 base64 返回 attachment_id 的文件 |
max_bytes |
否 | integer | 默认 1048576(1 MiB),最大 5242880(5 MiB) |
limit |
否 | integer | 列出的附件数,最新的在前;默认 50,最大 500 |
odoo_import_preview 写入¶
用 Odoo 自己的导入器(base_import,Odoo 16-19)预演一次导入:返回 Odoo 会报告的逐行错误和警告,以及 would_import,即它将创建或更新的记录数。它不导入任何内容:Odoo 会回滚这次执行,但仍可能消耗序列号并触发数据库之外的效果(例如自动化动作的 webhooks)。因此 Read-only mode 会拒绝它。需要 JSON-RPC 或 JSON-2(不支持 XML-RPC)。
| 参数 | 是否必需 | 类型 | 说明 |
|---|---|---|---|
model |
是 | string | 例如 res.partner |
fields |
是 | 字符串数组 | load() 的列名,例如 ["name", "email", "country_id"];字段/id 接收外部 id,id 存放记录自身的外部 id(最多 100 个) |
rows |
是 | 字符串数组的数组 | 每条记录一个字符串列表,按 fields 的顺序(CSV 单元格:日期 YYYY-MM-DD,数字使用 . 作小数点,many2one 按名称或用 字段/id);最多 500 行 |
odoo_import_preview {
"model": "res.partner",
"fields": ["name", "email"],
"rows": [["ACME S.A.", "hola@acme.mx"], ["Beta S.A.", "info@beta.mx"]]
}
odoo_import 写入¶
用 Odoo 的 load() 在一次原子调用中把多行导入一个模型:所有行全部保存或全部不保存,错误会说明原因。返回创建或更新的 id、数量以及 Odoo 的消息。id 列存放外部标识符:外部 id 已存在的行会更新该记录,而不是新建一条。fields 和 rows 与 odoo_import_preview 相同,每次调用最多 500 行。Odoo 12-19,通过 JSON-RPC 或 JSON-2。
在权限策略下,导入需要模型上的 create 和 write,并且每一列都会作为路径检查(指向 one2many 的列会在其关联模型上创建并写入明细行)。涉及已有联系人邮箱的 res.partner 导入遵循身份规则:参见 身份。
odoo_import { "model": "res.partner", "fields": ["name", "email"], "rows": [["ACME S.A.", "hola@acme.mx"]] }
导入:事先确认,且绝不通过 XML-RPC
这两个工具都不会自行运行:预演不会导入,智能体在 odoo_import 之前会先询问你。Odoo 的 XML-RPC 无法返回导入结果中携带的空值,因此处于 XML-RPC 的会话(Odoo 10-11,或 ODOO_TRANSPORT_PREF=xmlrpc)会在发送任何内容之前拒绝它们,而不是冒险把一次实际已保存的导入报告为错误。
若要理解名称如何在不同版本之间解析,请参见 跨版本兼容性。