mcpField
O
odoo-orm-expert

odoo-orm-expert

github.com/sickn33开发48.7k82 次安装今天更新
代码仓库

关于 odoo-orm-expert

面向 Odoo ORM 开发的指导技能,适用于编写数据操作、域筛选和计算字段,或排查查询性能问题。它提供惯用代码建议,并说明批处理、访问控制及循环内搜索等常见问题。

主要功能

  1. 01记录增删改查指导
  2. 02构建域筛选条件
  3. 03实现计算字段和关联字段
  4. 04审查 ORM 性能模式
  5. 05避免 N+1 查询问题
  6. 06考虑访问权限和记录范围

适用场景

  1. 01编写 Odoo 搜索与写入方法
  2. 02为视图或服务器操作筛选记录
  3. 03优化批量记录更新
  4. 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() 调用。
  • 为视图或服务器操作构建复杂的域筛选条件。
  • 实现计算字段、存储字段和关联字段。
  • 调试慢查询或优化批量操作。

工作原理

  1. 激活:提及 @odoo-orm-expert,并描述你需要执行的数据操作。
  2. 获取代码:获取正确、符合惯例的 Odoo ORM 代码及说明。
  3. 优化:请助手审查现有 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