レコードのどの項目を誰がいつ変更したかが気になったことはありませんか?Odooのトラッキング機能は、その答えを記録してくれます。
Odooは特定のフィールドの変更履歴をそのレコードのチャッターに自動で残します。別途監査システムを構築しなくても、チーム全員がデータの変化を時系列で追えます。
Odoo Studioで設定する場合でも、カスタムPythonモジュールで実装する場合でも、フィールドトラッキングの仕組みを理解することはOdooのデータモデルを扱う上で重要です。本ガイドでは基礎から実務での使い方まで解説します。
Odooの「トラッキング」機能とは何か?
Odooでは「トラッキング」は独立したフィールド型ではなく、既存フィールドに付与する属性です。Char、Many2one、Selection、Integer、Dateなどのフィールドに対して有効化でき、変更があればチャッターに旧値・新値・日時・変更者を自動で記録します。
記録はレコードのメッセージ履歴(チャッター)にログノートとして表示されます。たとえばCRMの商談であれば営業担当がステージを移動した瞬間に「ステージがNewからQualifiedに変更されました」といった履歴が自動で残ります。
ほとんどの標準フィールドタイプでトラッキングが使え、Odoo Studioから有効化するか、開発者がPythonでフィールド定義に属性を追加して使います。
どんなデータを保存するのか
トラッキングされた変更は各ドキュメントに紐づくmail.messageレコードとして保存されます。メッセージに含まれる情報は:
- 変更されたフィールドのラベル(項目名)
- 変更前の値(旧値)
- 変更後の値(新値)
- 変更が行われた日時
- 変更を実行したユーザー
これらの履歴はレコードの閲覧権限があるユーザーなら誰でも見られます。トラッキングを有効にする以外の特別な設定は不要です。
トラッキングはどう動くのか
トラッキングが動作するためには、モデルがmail.threadミックスインを利用している必要があります。チャッターやメッセージ機能はこのミックスインが提供するもので、sale.order、crm.lead、account.move、stock.pickingなど多くの標準モデルはすでに継承しています。
ユーザーがトラッキング対象フィールドを変更してレコードを保存すると、Odooが旧値と新値を比較して差分をチャッターに自動で記録します。ユーザー側で追加操作は不要です。
Odoo ORM上の技術的な振る舞い
技術的にはOdooのORMがwrite()処理をフックし、トラッキング対象のフィールドに変更があると旧値を取得して変更を適用した後、差分を記述するmail.messageを作成します。
Pythonコードでは、フィールド定義にtracking=Trueを付けることでトラッキングを有効にします。
例:
state = fields.Selection(
[('draft', 'Draft'), ('confirmed', 'Confirmed')],
tracking=True
)
複数フィールドが同時に変更された場合の並び順は、1〜10の優先度で制御できます。数値が小さいものが先に表示されます。
例:
partner_id = fields.Many2one('res.partner', tracking=1)
priority = fields.Selection(tracking=10)
関連レコードとの連携挙動
トラッキングログはそのフィールドが属するレコードに直接保存され、関連レコードへ自動で伝播することはありません。関連モデル全体で履歴が必要なら、各モデルで個別にトラッキングを有効にする必要があります。
これは設計上の意図であり、監査履歴を変更対象のオブジェクトに近い場所に保持することで、履歴の確認がシンプルになります。
業務での具体的な活用例
日常業務でトラッキングが役立つ実務例を5つ紹介します。
1. CRM/営業パイプライン管理
営業ではリードや商談がどのステージからどのステージへ移動したか、誰がその判断をしたかが重要です。CRMのstage_idにトラッキングを入れることで、全てのステータス遷移が時系列で残り、マネジメントやレビューに役立ちます。
停滞している商談の発見や、営業指導の材料を定量的に得られる点が大きな利点です。
2. 購買・請求の承認ワークフロー
会計や購買では、誰がいつ承認したかを証跡として残すことが求められます。purchase orderやvendor billのstateにトラッキングを付ければ、チャッター上で承認履歴がすぐに参照できます。
財務管理や内部監査の要件がある企業では特に有用です。
3. 在庫管理・棚卸の追跡
在庫数量や保管場所が意図せず変わった際、stock.moveやproductの重要フィールドにトラッキングを入れておけば、原因の特定が速くなります。
ログをさかのぼれば誰が何を変更したかが一目で分かり、現場での確認作業が減ります。
4. 顧客データの品質管理
取引先のメールや電話、価格表など重要な連絡先情報にトラッキングを設定しておくと、CRM内で連絡先情報の変更履歴を保てます。カスタマーサポートやデータクレンジングに役立ちます。
5. 人事(従業員情報)の管理
従業員レコードの役職や部署、給与グレードといった項目に変更履歴を残すことで、HRの監査やコンプライアンス対応が容易になります。
トラッキングを作成・カスタマイズする方法
トラッキングを有効にする方法は主に2つ。Odoo Studioを使うノーコード方式と、Pythonで実装する開発者向け方式です。
Odoo Studioを使う場合
Odoo Studioではコードを書かずに既存フィールドのトラッキングを有効化できます。対象モデルでStudioを開き、監視したいフィールドを選んでフィールド設定の「Track Changes(変更を追跡)」をオンにするだけです。
有効化すると以降の変更がチャッターに記録されます。管理者や業務担当者が手早くトラッキングを追加したいときに推奨される方法です。
Studioで新規フィールドを作成する際にも同じ画面からトラッキングを有効にできます。
Pythonでカスタムモジュールを作る場合
開発者向けには、モデルクラスのフィールド定義にtracking属性を追加するのが標準的なやり方です。
モデルは必ずmail.threadを継承する必要があります。最小限の実装例:
例:
from odoo import models, fields
class ProjectTask(models.Model):
_name = 'project.task'
_inherit = ['project.task', 'mail.thread']
x_client_priority = fields.Selection(
[('low', 'Low'), ('medium', 'Medium'), ('high', 'High')],
string='Client Priority',
tracking=True
)
既存モデルを拡張する際によく使うパターンで、フィールド自体は通常のDBフィールドとして扱われますが値が変わると自動的に履歴が残ります。
カスタムモデルに関する重要な注意点
新規にモデルを作る場合は、_inheritに['mail.thread','mail.activity.mixin']を含めることを忘れないでください。これがないとトラッキングは無効化され、変更がチャッターに記録されません。
初めてOdooでフィールドを追跡しようとする開発者が躓きやすいポイントなので、必ず確認してください。
運用のベストプラクティス
トラッキングは設定自体は簡単ですが、誤用すると運用が煩雑になります。以下の指針を参考にしてください。
本当に必要なフィールドだけを追跡する
すべてのフィールドにトラッキングを入れるとチャッターがノイズだらけになり、重要な履歴が埋もれます。ステータス、担当者、重要な日付や金額など、監査や業務で意義のある項目に絞ること。
優先度(priority)で並びを制御する
同一保存操作で複数項目が変わる場合、priorityを使って表示順を調整するとチャッターの可読性が上がります。
アクセス権と組み合わせる
トラッキングは適切なレコードルールやアクセス管理と組み合わせて初めて価値を発揮します。誰でも自由に変更できる状態では証跡の意味が薄れますので、先に権限設計を整えましょう。
どのフィールドを追跡しているかをドキュメント化する
複数人や複数プロジェクトで運用している場合、トラッキング設定の一覧を残しておくとコードレビュー時やアップグレード時の混乱を防げます。
本番投入前にテストする
ステージング環境でトラッキング挙動を検証してください。特に計算フィールドやrelatedフィールドは標準の保存フィールドと違う挙動をすることがあります。
よくある落とし穴と注意点
トラッキングでよくあるミスを示します。
mail.threadを継承し忘れる
最も多い失敗例です。カスタムモデルがmail.threadを継承していないとtracking属性は無視され、エラーも出ずにチャッターにログが残りません。動作しないときはまず継承を確認してください。
非保存(store=False)の計算フィールドを追跡しようとする
計算フィールドはstore=Trueで保存されていない限り追跡できません。非保存の計算フィールドには永続的な値がないため比較対象が存在せず、トラッキングが無効になります。
あまりに多くのフィールドでトラッキングを有効にする
透明性を求めて全部にONにしたくなりますが、結果としてチャッターが読みにくくなります。実務的に意味がある項目だけに絞ってください。
ORMを経由しない一括更新ではトラッキングが動かない期待外れ
トラッキングは標準のwrite()を通した更新で発火します。直接SQL更新やORMをバイパスするインポート、低レベルAPI呼び出しはトラッキングをトリガーしません。XML-RPCやバッチ処理を使う場合はORM経由で書き込まれることを確認してください。
Studioとコードの定義が競合するケース
Studioで作ったフィールドにtrackingを入れていた場合、後で同じフィールドをPythonモジュールで上書きすると設定の食い違いで予期せぬ挙動が起きることがあります。Studioとコードの両方で管理する際は注意が必要です。
よくある質問(FAQ)
どのモデルでもフィールドを追跡できる?
mail.threadを継承しているモデルだけがトラッキングに対応します。標準の多くのビジネスモデルは対応済みですが、新規作成のカスタムモデルは明示的に継承を追加してください。
トラッキングを有効にするとパフォーマンスに影響はある?
通常の利用では影響は小さく、変更ごとにmail.messageレコードが増える分のオーバーヘッドが生じます。ただし非常に高頻度で更新されるモデルにはトラッキング対象を絞るなど設計上の配慮が必要です。
トラッキングをオフにして既存の履歴は消える?
いいえ。トラッキングを無効にすると以降の変更は記録されなくなりますが、過去に保存されたチャッターのログはそのまま残ります。既存履歴は保持されます。
Many2manyフィールドはトラッキングできる?
はい。Many2manyもサポートされています。チャッターには関連レコードが追加・削除された旨が表示され、単純な値の前後比較とは表示形式が異なる点に注意してください。
Odoo Studioを使わずにトラッキングを使えますか?
もちろんです。trackingはOdooフレームワークの標準的なPythonフィールド属性なので、Studioを使わずにカスタムモジュール内で有効化できます。Studioは同じ機能をGUIで扱えるだけです。
まとめ
トラッキングは初期設定がシンプルながら実務上の価値が大きい機能です。適切なフィールドに導入すれば、誰が何を変えたかの信頼できる証跡が得られ、社内での争いごとを減らし、データガバナンスの土台を作れます。
Odoo Studioで手早くノーコード導入するにせよ、カスタムPythonモジュールで組み込むにせよ、いずれの方法でも結果は同じです:業務データの変化を時系列で可視化できます。
重要なのはどこに適用するかを見極めることです。意思決定や承認、責任所在に関わるフィールドに絞れば、最小限の手間で最大の効果が得られます。
私たちDasoloは、企業の業務に合わせたOdooの導入・カスタマイズ・最適化を支援しています。データモデル設計やワークフロー全体へのトラッキング実装、カスタムモジュール開発まで幅広く対応可能です。
導入のご相談はお気軽にどうぞ。 お問い合わせ 一緒に最適なOdoo運用方針を設計しましょう。