☰
ODOO 新API修饰符实战:用 TaoToken 统一 Key 打通配置骨架
2026/9/26 12:19:40 网站建设 项目流程

1. ODOO 新 API 修饰符到底解决了什么问题

如果你写过 ODOO 自定义模块,大概率遇到过这种场景:一个create方法里循环处理vals_list,结果批量导入时性能掉得厉害;或者@api.depends里想根据当前语言、时区动态计算字段,却发现缓存把结果锁死了。这些问题的根源,往往不是业务逻辑写错,而是修饰符没用对。

ODOO 从 13.0 开始逐步用新 API 修饰符替换旧写法,到 16.0/17.0 已经形成一套比较稳定的体系。核心变化集中在几个修饰符上:@api.model_create_multi让create一次接收多条记录,@api.depends_context让计算字段能感知上下文变化,@api.constrains在写入时做校验,@api.ondelete控制删除行为。它们共同的目标是:让 ORM 在批量操作、缓存、上下文切换时行为可预测。

这篇面向的是需要多工具协作的 ODOO 开发者——你可能同时用编辑器插件、命令行工具、AI 辅助编码来写模块。工具链一多,配置就散,Key 也散。所以我会把两件事放在一起讲:一是新修饰符在自定义模块里的落地写法,二是用 TaoToken 统一 Key 把工具链配置骨架搭起来。目标很直接:修饰符用法和工具链配置一次讲清,你照着复制就能跑。

2. 前置准备:TaoToken 统一 Key 与工具链骨架

在写代码之前,先把工具链的“入口”统一掉。多工具协作最烦的就是每个工具一套 Key、一套配置,改一处漏一处。TaoToken 的做法是给你一个统一 Key,然后通过不同 deep link 分流到模型对话、Coding Plan、控制台、API Keys、接入文档等具体页面。

先拿 Key。打开控制台页面,登录后进入 API Keys 管理,新建一个 Key 并复制。这个 Key 后面会同时用在编辑器配置和命令行请求里。

  • 控制台入口:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite
  • 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
  • 模型对话(验证模型是否通):https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite
  • Coding Plan(长期编码/Agent 场景):https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite

API 基础地址是https://taotoken.net/api,注意这个地址不带 UTM 参数,直接用于代码里的base_url。官网首页是https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,需要看整体介绍时再点。

注意:Key 只存在本地配置文件里,不要提交到 Git。下面给的骨架里用占位符sk-xxxx,你替换成自己的。

3. 可复制配置:settings.json 与 config.toml 骨架

工具链配置分两块:编辑器侧用settings.json,命令行/Agent 侧用config.toml。两者共用同一个 Key 和同一个base_url,这样切换工具时不用重新找凭证。

3.1 settings.json 骨架

适用于 VS Code 及其衍生编辑器。把下面内容合并进你的用户设置或工作区设置:

{ "taotoken.baseUrl": "https://taotoken.net/api", "taotoken.apiKey": "sk-xxxx", "taotoken.defaultModel": "claude-sonnet-4-20250514", "editor.formatOnSave": true, "python.analysis.extraPaths": [ "./odoo/addons", "./custom_addons" ], "files.associations": { "*.xml": "xml", "*.py": "python" } }

这里taotoken.baseUrl指向 API 地址,taotoken.apiKey填你刚复制的 Key。defaultModel按你实际可用的模型填,不确定就先走模型对话页面确认。

3.2 config.toml 骨架

适用于命令行工具和 Agent 类客户端。放在用户目录下的.config/taotoken/config.toml:

[provider] name = "taotoken" base_url = "https://taotoken.net/api" api_key = "sk-xxxx" timeout_seconds = 60 [defaults] model = "claude-sonnet-4-20250514" max_tokens = 4096 temperature = 0.2 [odoo] addons_path = "./custom_addons" python_bin = "python3"

temperature给 0.2 是为了让代码生成更稳定,ODOO 模块里字段名、方法名写错一个字母就报错,低温度能减少这种抖动。addons_path指向你的自定义模块目录,后面跑odoo-bin时可以直接引用。

3.3 修饰符落地代码骨架

配置搭好后,写一个自定义模块来演示新修饰符。假设模块名custom_library,核心模型library.book:

from odoo import api, fields, models from odoo.exceptions import ValidationError class LibraryBook(models.Model): _name = "library.book" _description = "Library Book" name = fields.Char(required=True) isbn = fields.Char() author_ids = fields.Many2many("res.partner", string="Authors") state = fields.Selection( [("draft", "Draft"), ("published", "Published")], default="draft", ) display_name_ctx = fields.Char( compute="_compute_display_name_ctx", store=False, ) @api.model_create_multi def create(self, vals_list): for vals in vals_list: if vals.get("isbn") and len(vals["isbn"]) != 13: raise ValidationError("ISBN 必须是 13 位") return super().create(vals_list) @api.depends("name", "state") @api.depends_context("lang", "tz") def _compute_display_name_ctx(self): for rec in self: rec.display_name_ctx = f"{rec.name} [{rec.state}] ({self.env.context.get('lang')})" @api.constrains("isbn") def _check_isbn(self): for rec in self: if rec.isbn and not rec.isbn.isdigit(): raise ValidationError("ISBN 只能包含数字") @api.ondelete(at_uninstall=False) def _unlink_if_draft(self): for rec in self: if rec.state != "draft": raise ValidationError("只有草稿状态的书可以删除")

几个关键点:@api.model_create_multi的vals_list是列表,批量创建时只走一次方法,比旧写法循环调用create快很多。@api.depends_context让计算字段在语言或时区变化时重新计算,store=False配合使用避免脏缓存。@api.constrains在create、write时触发,注意它不处理unlink。@api.ondelete的at_uninstall=False表示模块卸载时不执行该检查,避免卸载报错。

4. 验证请求:跑一次修饰符行为验证

配置和代码都就位后,做一次行为验证。分两步:先确认工具链能通,再确认修饰符行为符合预期。

4.1 确认 API 连通

用 curl 发一个最小请求,验证 Key 和 base_url 是否正确:

curl -X POST https://taotoken.net/api/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: sk-xxxx" \ -H "anthropic-version: 2023-06-01" \ -d '{ "model": "claude-sonnet-4-20250514", "max_tokens": 64, "messages": [{"role": "user", "content": "reply with ok"}] }'

返回里能看到content字段就说明通了。如果返回 401,检查 Key 是否复制完整;返回 404,检查base_url是否多了斜杠或路径。

4.2 验证 model_create_multi 批量行为

在 ODOO shell 里跑:

books = env["library.book"].create([ {"name": "Book A", "isbn": "9781234567890"}, {"name": "Book B", "isbn": "9781234567891"}, ]) print(len(books)) # 期望 2

如果create里没写@api.model_create_multi,这里会报参数错误,因为新版本 ORM 传的是列表。加上修饰符后,vals_list正常接收两条,返回记录集长度 2。

4.3 验证 depends_context 触发

book = env["library.book"].create({"name": "Ctx Book"}) print(book.display_name_ctx) # 含当前 lang book.with_context(lang="zh_CN").display_name_ctx

切换lang后重新读取,值应随上下文变化。如果没加@api.depends_context,缓存会返回旧值,这就是它存在的意义。

4.4 验证 ondelete 拦截

book = env["library.book"].create({"name": "Del Book", "state": "published"}) book.unlink() # 期望抛 ValidationError

抛错说明@api.ondelete生效。把state改成draft再删,应该成功。

5. 本篇常见错排查

报错一:create() takes 2 positional arguments but 3 were given说明create方法没加@api.model_create_multi,但 ORM 按新协议传了vals_list。补上修饰符,参数名用vals_list。

报错二:@api.depends_context不生效,字段值不更新检查是否同时写了store=True。depends_context通常配合store=False使用;如果必须存储,需要在上下文变化时手动触发重算,成本较高,建议改非存储。

报错三:@api.constrains在 unlink 时没触发这是设计如此。constrains只覆盖create和write。删除校验要用@api.ondelete。

报错四:@api.ondelete在模块卸载时报错把at_uninstall设为False,否则卸载时检查逻辑可能因为依赖数据已删而失败。

报错五:curl 返回invalid api keyKey 前后有空格,或者用了Authorization: Bearer而该端点要x-api-key。按第 4.1 节的 header 写。

报错六:settings.json 里配置不生效确认编辑器重启过,且工作区设置没有覆盖用户设置。taotoken.baseUrl不要写成https://taotoken.net/api/,末尾斜杠会导致路径拼接错误。

6. 把 Key 和修饰符一起收进工作流

到这里,修饰符写法和工具链配置已经串起来了。我的习惯是:新模块先写@api.model_create_multi的create,再补@api.constrains做字段校验,计算字段一律先想清楚要不要depends_context。工具链这边,settings.json和config.toml共用同一个 Key,换工具时只改一处。

如果你主要做长期编码或 Agent 类任务,可以走 Coding Plan 页面看更细的配置:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。需要重新生成或管理 Key 时,回 API Keys 页面:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 。接入细节以文档为准:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。

最后留一个实用技巧:在config.toml里把temperature压到 0.2 以下,生成 ODOO 代码时字段名和方法签名会稳很多;settings.json里把python.analysis.extraPaths指向你的custom_addons,编辑器才能正确跳转到自定义模型。这两处配好,修饰符写起来基本不会因为拼写问题返工。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询