🛠️ Odoo Orm Expert
Odooという業務システムで、データの検索や
📺 まず動画で見る(YouTube)
▶ 【衝撃】最強のAIエージェント「Claude Code」の最新機能・使い方・プログラミングをAIで効率化する超実践術を解説! ↗
※ jpskill.com 編集部が参考用に選んだ動画です。動画の内容と Skill の挙動は厳密には一致しないことがあります。
📜 元の英語説明(参考)
Master Odoo ORM patterns: search, browse, create, write, domain filters, computed fields, and performance-safe query techniques.
🇯🇵 日本人クリエイター向け解説
Odooという業務システムで、データの検索や
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o odoo-orm-expert.zip https://jpskill.com/download/3241.zip && unzip -o odoo-orm-expert.zip && rm odoo-orm-expert.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/3241.zip -OutFile "$d\odoo-orm-expert.zip"; Expand-Archive "$d\odoo-orm-expert.zip" -DestinationPath $d -Force; ri "$d\odoo-orm-expert.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
odoo-orm-expert.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
odoo-orm-expertフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-17
- 取得日時
- 2026-05-17
- 同梱ファイル
- 1
💬 こう話しかけるだけ — サンプルプロンプト
- › Odoo Orm Expert を使って、最小構成のサンプルコードを示して
- › Odoo Orm Expert の主な使い方と注意点を教えて
- › Odoo Orm Expert を既存プロジェクトに組み込む方法を教えて
これをClaude Code に貼るだけで、このSkillが自動発動します。
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
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
ベストプラクティス
- ✅ すべきこと: Pythonのループの代わりに、レコードセットに対して
mapped()、filtered()、sorted()を使用してください。 - ✅ すべきこと:
sudo()は控えめに、セキュリティ上の影響を理解している場合にのみ使用してください。 - ✅ すべきこと: カウントのみが必要な場合は、
len(search(...))よりもsearch_count()を優先してください。 - ✅ すべきこと:
self.env.contextを直接変更するのではなく、with_context(...)を使用してコンテキスト値をきれいに渡してください。 - ❌ すべきでないこと: ループ内で
search()を呼び出さないでください — これはOdooのパフォーマンスを最も低下させる要因です。 - ❌ すべきでないこと: 絶対に必要な場合を除き、生のSQLを使用しないでください。すべての標準操作にはORMを使用してください。
- ❌ すべきでないこと: Pythonの
datetime/dateオブジェクトをドメインタプルに直接渡さないでください — 常に'YYYY-MM-DD'の文字列形式に変換してください。
制限事項
cr.execute()の生のSQLパターンについては深くカバーしていません — SQLレベルの最適化にはOdooパフォーマンスチューナースキルを使用してください。- 保存された算出フィールドは、大規模な場合にかなりの書き込みオーバーヘッドを引き起こす可能性があります。このスキルではパーティショニング戦略はカバーしていません。
- 一時モデル (
models.TransientModel) やウィザードパターンはカバーしていません。 - ORMの動作は、設定のオーバーライドによりOdoo SaaSとオンプレミスで若干異なる場合があります。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Odoo ORM Expert
Overview
This skill teaches you Odoo's Object Relational Mapper (ORM) in depth. It covers reading/writing records, building domain filters, working with relational fields, and avoiding common performance pitfalls like N+1 queries.
When to Use This Skill
- Writing
search(),browse(),create(),write(), orunlink()calls. - Building complex domain filters for views or server actions.
- Implementing computed, stored, and related fields.
- Debugging slow queries or optimizing bulk operations.
How It Works
- Activate: Mention
@odoo-orm-expertand describe what data operation you need. - Get Code: Receive correct, idiomatic Odoo ORM code with explanations.
- Optimize: Ask for performance review on existing ORM code.
Examples
Example 1: Search with Domain Filters
# 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.
Example 2: Computed Field
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)
Example 3: Safe Bulk Write (avoid 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
Best Practices
- ✅ Do: Use
mapped(),filtered(), andsorted()on recordsets instead of Python loops. - ✅ Do: Use
sudo()sparingly and only when you understand the security implications. - ✅ Do: Prefer
search_count()overlen(search(...))when you only need a count. - ✅ Do: Use
with_context(...)to pass context values cleanly rather than modifyingself.env.contextdirectly. - ❌ Don't: Call
search()inside a loop — this is the #1 Odoo performance killer. - ❌ Don't: Use raw SQL unless absolutely necessary; use ORM for all standard operations.
- ❌ Don't: Pass Python
datetime/dateobjects directly into domain tuples — always stringify them as'YYYY-MM-DD'.
Limitations
- Does not cover
cr.execute()raw SQL patterns in depth — use the Odoo performance tuner skill for SQL-level optimization. - Stored computed fields can cause significant write overhead at scale; this skill does not cover partitioning strategies.
- Does not cover transient models (
models.TransientModel) or wizard patterns. - ORM behavior can differ slightly between Odoo SaaS and On-Premise due to config overrides.