跳转至

工具参考

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 写入 在一次原子调用中导入多行

读取与查询

搜索一个模型并返回匹配的 id。

参数 是否必需 类型 说明
model 是 string 现代名称或历史名称
domain 否 array Odoo 搜索域
limit / offset / order 否 分页与排序
odoo_search { "model": "sale.order", "domain": [["state","=","sale"]], "limit": 5 }

odoo_search_count

统计与某个域匹配的记录数(不获取数据)。

odoo_search_count { "model": "account.move", "domain": [["state","=","posted"]] }

odoo_read

按 id 读取记录,可选择限定字段。

参数 是否必需 类型
model 是 string
ids 是 整数数组
fields 否 字符串数组
odoo_read { "model": "res.partner", "ids": [7, 9], "fields": ["name","email"] }

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_version {}

odoo_connections

无参数。列出服务器上有活动会话的 Odoo 实例。自 v1.5.0 起,它会在所有配置档中从所报告的 URL 里去掉 Odoo 前面基本认证的 user:pass@。

odoo_connections {}

odoo_list_models

列出模型,可选择按名称片段过滤。它会略去权限策略在其上不允许任何操作的模型,并在 hidden_by_policy 中返回数量。

参数 是否必需 类型 说明
like 否 string 片段(不区分大小写)
limit 否 integer 默认 200
odoo_list_models { "like": "sale", "limit": 50 }

odoo_fields_get

返回一个模型的字段定义(带缓存)。它接受历史名称或现代名称。

参数 是否必需 类型
model 是 string
attributes 否 字符串数组
odoo_fields_get { "model": "account.move", "attributes": ["string","type","required"] }

odoo_module_info

按技术名称获取一个模块的安装状态和元数据。

odoo_module_info { "name": "web_enterprise" }

odoo_telemetry_preview

无参数。显示你可以分享的 opt-in 遥测负载的确切内容;遥测关闭时(默认,用 ODOO_TELEMETRY=opt-in 开启)返回 opted_in: false。只读:它从不传输任何内容。返回 { opted_in, payload, note }。参见 隐私。

odoo_telemetry_preview {}

odoo_translate_get

读取某条记录某个字段在特定语言下的值。

参数 是否必需 类型 说明
model 是 string
id 是 integer
field 是 string
lang 是 string 例如 es_MX、en_US、zh_CN
odoo_translate_get { "model": "product.template", "id": 42, "field": "name", "lang": "en_US" }

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_create { "model": "res.partner", "values": { "name": "ACME S.A.", "email": "hola@acme.mx" } }

odoo_write 写入

按 id 更新记录。

参数 是否必需 类型
model 是 string
ids 是 整数数组
values 是 object
odoo_write { "model": "res.partner", "ids": [15], "values": { "phone": "+52 55 0000 0000" } }

按 id 删除记录。在默认配置档 standard 下,它不会被列出,删除也会被拒绝:在模型有 active 字段的地方,请改用 odoo_write { ..., "values": { "active": false } } 归档。它在 builder(只在定制类模型上删除,除非策略文件开放了 unlink)和 full 下会被列出。

odoo_unlink { "model": "res.partner", "ids": [999] }

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_execute { "model": "account.move", "method": "action_post", "ids": [128] }

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_online_profile {}

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_api_catalog { "model": "res.partner", "method": "write" }

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_access_check { "model": "sale.order", "operations": ["write"], "ids": [42] }

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_record_documents { "model": "account.move", "res_id": 128 }

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)会在发送任何内容之前拒绝它们,而不是冒险把一次实际已保存的导入报告为错误。


若要理解名称如何在不同版本之间解析,请参见 跨版本兼容性。