
关于
掌握 Odoo ORM 模式:搜索、浏览、创建、写入、域过滤器、计算字段和性能安全查询。
name: odoo-orm-expert description: "掌握 Odoo ORM 模式:search、browse、create、write、域过滤器、计算字段和性能安全的查询技术。" risk: safe source: "self"
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)
# ✅ GOOD: One query for all records
partners = self.env['res.partner'].search([('country_id', '=', False)])
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 模式 — 请使用 Odoo 性能调优技能进行 SQL 级优化。 - 存储计算字段 在大规模场景下可能导致显著的写入开销;此技能不涵盖分区策略。
- 不涵盖 临时模型(
models.TransientModel)或向导模式。 - ORM 行为在 Odoo SaaS 和本地部署之间可能因配置覆盖而略有不同。
兼容工具
Claude CodeCursor
标签
后端开发
