关于 odoo-orm-expert
面向 Odoo ORM 开发的指导技能,适用于编写数据操作、域筛选和计算字段,或排查查询性能问题。它提供惯用代码建议,并说明批处理、访问控制及循环内搜索等常见问题。
主要功能
- 01记录增删改查指导
- 02构建域筛选条件
- 03实现计算字段和关联字段
- 04审查 ORM 性能模式
- 05避免 N+1 查询问题
- 06考虑访问权限和记录范围
适用场景
- 01编写 Odoo 搜索与写入方法
- 02为视图或服务器操作筛选记录
- 03优化批量记录更新
- 04排查缓慢的 ORM 查询
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill odoo-orm-expert安装后在 Claude Code 中输入/odoo-orm-expert确认已加载。
详细介绍
原文在翻译后有更新,译文可能不是最新。
Odoo ORM 专家
概述
本技能将深入讲解 Odoo 的对象关系映射器(ORM)。内容涵盖记录的读取与写入、域筛选条件的构建、关系字段的使用,以及如何避免 N+1 查询等常见性能问题。
何时使用此技能
- 编写
search()、browse()、create()、write()或unlink()调用。 - 为视图或服务器操作构建复杂的域筛选条件。
- 实现计算字段、存储字段和关联字段。
- 调试慢查询或优化批量操作。
工作原理
- 激活:提及
@odoo-orm-expert,并描述你需要执行的数据操作。 - 获取代码:获取正确、符合惯例的 Odoo ORM 代码及说明。
- 优化:请助手审查现有 ORM 代码的性能。
示例
示例 1:使用域筛选条件进行搜索
# Find all confirmed sale orders for a specific customer, created this year
import datetime
start_of_year = datetime.date.today().replace(month=1, day=1).strftime('%Y-%m-%d')
orders = self.env['sale.order'].search([
('partner_id', '=', partner_id),
('state', '=', 'sale'),
('date_order', '>=', start_of_year),
], order='date_order desc', limit=50)
# Note: pass dates as 'YYYY-MM-DD' strings in domains,
# NOT as fields.Date objects — the ORM serializes them correctly.
示例 2:计算字段
total_order_count = fields.Integer(
string='Total Orders',
compute='_compute_total_order_count',
store=True
)
@api.depends('sale_order_ids')
def _compute_total_order_count(self):
for record in self:
record.total_order_count = len(record.sale_order_ids)
示例 3:安全的批量写入(避免 N+1)
# Batch writes reduce repeated calls, but can trigger additional compute/tracking queries
partners = self.env['res.partner'].browse(approved_partner_ids).exists() # Explicit scoped IDs
partners.write({'country_id': self.env.ref('base.us').id})
# ❌ BAD: Triggers a separate query per record
for partner in partners:
partner.country_id = self.env.ref('base.us').id
最佳实践
- ✅ 应该: 对记录集使用
mapped()、filtered()和sorted(),而不是使用 Python 循环。 - ✅ 应该: 谨慎使用
sudo(),且仅在了解其安全影响时使用。 - ✅ 应该: 如果只需要计数,优先使用
search_count(),而不是len(search(...))。 - ✅ 应该: 使用
with_context(...)以简洁地传递上下文值,而不是直接修改self.env.context。 - ❌ 不要: 在循环中调用
search()——这是 Odoo 中最常见的性能杀手。 - ❌ 不要: 除非绝对必要,否则不要使用原生 SQL;所有标准操作都应使用 ORM。
- ❌ 不要: 将 Python
datetime/date对象直接传入域元组——应始终将其转换为'YYYY-MM-DD'字符串。
限制
- 未深入介绍
cr.execute()原生 SQL 模式——如需 SQL 级优化,请使用 Odoo 性能调优技能。 - 存储计算字段在大规模场景下可能导致显著的写入开销;本技能不涉及分区策略。
- 未涉及 临时模型(
models.TransientModel)或向导模式。 - 由于配置覆盖,Odoo SaaS 与本地部署版本的 ORM 行为可能略有不同。
示例是模型方法片段,使用时需要补充导入、记录定义和授权范围。不要因为缺少国家数据就推断为美国;只向选定记录写入已确认的值。sudo() 会绕过访问规则,因此必须有合理的使用边界。批量操作不保证只执行一条 SQL 查询,mapped()/filtered() 也可能加载大型记录集;请分析实际查询数量,并测试记录规则与多公司隔离。
评论
支持 Markdown