コンテンツへスキップ

OdooのDate Fieldを徹底解説:使い方・設定・注意点まとめ

Odooのデータモデルで使われる「日付」フィールドについて、基本的な使い方から開発者向けのカスタマイズまで、必要な情報を一通りまとめました。日付フィールドの種類や保存形式、表示の仕方、検索・絞り込みでの扱い、タイムゾーンの注意点、入力検証、フォームやリストでのレイアウト調整、Python/ORMでの操作、XMLビューでの定義、そしてカスタムウィジェットや自動値設定といった拡張手法まで、実務でよく直面する課題とその解決方法をわかりやすく解説します。
2026年3月6日 by
OdooのDate Fieldを徹底解説:使い方・設定・注意点まとめ
Dasolo
| まだコメントがありません

導入


Odooで受注、プロジェクトのタスク、製造オーダーを開いたことがあれば、そこには必ず日付を扱う項目が使われています。納期、出荷日、請求書の期日、契約開始日といった時間に依存する情報の多くは、日付フィールドで記録されます。

ユーザー目線では日付フィールドは直感的です:クリックすればカレンダーが出て、日付を選ぶだけ。しかし内部では別のルールが働いています。Odooのデータモデルで日付フィールドが何を保存するか、DateTimeフィールドとどう違うか、どのように作成・調整するかを理解しておくと、ワークフローの精度が上がり、タイムゾーンにまつわるトラブルを未然に防げます。

本ガイドは、Odooでの日付フィールドについて、保存内容から実務での使い方まで必要な知識を一通りまとめた実務向けの解説です。

Odooにおける日付フィールドとは


OdooのORMで使う fields.Date は「年月日だけ」を保存するための型です。例えば「2026-03-06」はそのままのカレンダー日付として保持され、時刻情報(時・分・秒)は含まれません。

バックエンドのPostgreSQLでは、Date型はデータベースの DATE カラムに対応します。これは時刻を含む TIMESTAMP(DateTime)とは明確に区別され、時刻やゾーン情報を持たない点が特徴です。

画面上では、日付フィールドはテキスト入力+カレンダー選択で表示されます。直接入力もでき、一覧表示ではロケールに合わせた表示形式で整列された文字列として見えます。

カスタムモジュールでのフィールド定義のイメージ

from odoo import fields, models

class ProjectTask(models.Model):
    _inherit = 'project.task'

    x_deadline_confirmed = fields.Date(
        string='Confirmed Deadline',
        help='The officially confirmed deadline agreed with the customer.',
    )

Odoo Studio上ではシンプルに「Date(日付)」と呼ばれ、Studioで作ると自動で x_studio_ プレフィックスが付きます。PythonコードやAPI経由で作る場合は技術名を自分で決めます。

フィールドの動作仕組み


Date と DateTime の違い(実務で気にすべき点)

日付フィールドで最も重要なのは「含まれていないもの」です:時刻情報は存在しません。時刻やタイムゾーン変換は発生せず、あくまでカレンダー上の年月日だけを扱います。

一方、DateTimeは完全なタイムスタンプを持ち、データベースにはUTCで保存されます。表示時にユーザーのタイムゾーンに合わせて変換されるため、“日付が1日ずれた”と感じる問題はほとんどDateTime由来です。

Dateフィールドに記録した値は、そのまま全員が同じように見ます。2026-03-15と保存したなら、世界中どこから見ても2026-03-15です。

主要なフィールド属性

Odooで日付フィールドに設定できる代表的なプロパティを挙げます。

  • required:画面・モデル両方で必須にするかどうか。
  • default:自動初期値を設定できます。例えば fields.Date.today を指定すると新規レコードで今日の日付が入ります。
  • index:検索や絞り込みを高速化するDBインデックスを作成します。
  • compute:Pythonメソッドで計算して値を決める場合に使います。
  • store:compute と併せて計算結果をDBに保存するかどうかを制御します。
  • readonly:ユーザーが画面で編集できないようにします。
  • copy:レコード複製時に値を持ち越すかを決めます。既定は True。

ビューでの表示

フォームではカレンダー付きの入力欄、一覧では整形された文字列、検索ビューでは標準で「今週」「今月」「この四半期」などの期間フィルタや、特定の日付より前後を比較する演算子が使えます。

表示形式はユーザーの言語設定に依存します(米国ではMM/DD/YYYY、欧州ではDD/MM/YYYYなど)。ただし内部保存は常にISO形式(YYYY-MM-DD)です。

ORMとのやり取り

コードで読み取るときは Python の datetime.date オブジェクト、空なら False が返ります。書き込む際は datetime.date か "YYYY-MM-DD" 形式の文字列を渡せます。XML-RPC経由では日付は文字列として渡されます。

日付フィールドは複雑な変換を要求しないため、フレームワークが表示・保存を自動で扱ってくれる点が開発・運用の利便性に繋がっています。

ビジネスでの利用例


日付フィールドはOdooの各領域で広く使われています。ここでは業務上よくある5つの具体的ユースケースを紹介します。

CRM:契約の開始日・終了日管理

営業で契約の有効期間を管理する際、リードや契約オブジェクトに日付フィールドを置くことで開始日と終了日を明確に管理できます。契約の有効性や更新管理が一目で分かるようになります。

自動アクションと組み合わせれば、契約終了間近に自動で通知メールを送ったりステータスを変えたりできます。手作業のフォローを減らし、更新漏れを防止します。

販売:顧客希望の納期管理

受注時に顧客が希望する納期を記録するために、販売注文に "顧客希望納期" の日付フィールドを設ける企業が多いです。

時刻情報のない Date を使うことで、倉庫や配送側でタイムゾーンのせいで日付が変わるといった混乱を避けられます。営業が入力した日付がそのまま現場の基準になります。

在庫:ロットの賞味期限管理

食品、医薬品、化学品などの業界では、ロット単位で賞味期限や消費期限を倉庫管理する必要があります。Odooのロット管理はこうした期限を Date フィールドで扱います。

期限情報はFEFO(先に期限が切れるものから出庫)戦略や期限接近の自動アラートに使われ、コンプライアンスと品質維持に貢献します。

会計:請求書の支払期日

請求書の支払期日は Date フィールドで管理されます。これによって自動リマインダー、延滞判定、売掛・買掛のエイジングレポートが正しく機能します。

期日がずれると資金繰りの管理やフォローアップの自動化が壊れてしまうため、請求期日の正確な管理は非常に重要です。

人事:入社日、契約・認証の期限管理

人事部門では入社日、試用期間終了日、契約開始・終了日、資格・免許の更新期限など、日付フィールドに依存するプロセスが多くあります。

これらの日付は自動通知や給与計算ルールのトリガーにもなるため、社員レコードの正確な日付管理はHRモジュールの要です。

日付フィールドの作り方・カスタマイズ方法


日付フィールドをOdooモデルに追加する方法は主に3つあります。環境や運用方針に合わせて選択します。

Odoo Studio(ノーコード)で作る方法

Odoo Studioはコードを書かずに日付フィールドを追加できる最も簡単な方法で、業務ユーザーやコンサルタントに推奨されます。

  1. メインメニューからOdoo Studioを開く。
  2. フィールドを追加したいフォームに移動する。
  3. サイドバーから「Date」フィールドをドラッグしてフォームへ配置する。
  4. ラベルや必須設定、デフォルト値を必要に応じて設定する。
  5. Studioを保存して閉じる。

Studioで作成したフィールドには自動的に x_studio_ プレフィックスが付与され、即座にフォームに反映されます。DB移行作業は必要ありません。

カスタムモジュール(Python)で作る方法

開発者がモジュールを作成する場合は、モデルのPythonファイルでフィールドを定義します。バージョン管理や複数環境への展開が必要なケースはこちらが適切です。

from odoo import fields, models

class SaleOrder(models.Model):
    _inherit = 'sale.order'

    x_customer_requested_date = fields.Date(
        string='Customer Requested Date',
        index=True,
        copy=False,
        help='Delivery date requested by the customer at time of order.',
    )

モデルにフィールドを追加したら、画面に表示するためのビューXMLにも項目を追加します。モジュールをインストールまたはアップグレードすると、Odooが自動でDB列を作成します。

XML-RPC APIを使った作成方法

導入パイプラインやリモート設定スクリプトの一部としてプログラムでフィールドを作る場合、XML-RPC APIから日付フィールドを作成できます。

field_id = models.execute_kw(
    ODOO_DB, uid, ODOO_API_KEY,
    'ir.model.fields', 'create',
    [{
        'name': 'x_customer_requested_date',
        'field_description': 'Customer Requested Date',
        'model_id': model_id,
        'ttype': 'date',
        'state': 'manual',
    }]
)

日付フィールドの ttype は 'date' です。DateTimeなら 'datetime' になります。state を 'manual' にするとモジュール由来ではなく手動作成だとOdooに記録されます。

運用上のベストプラクティス


1. 時刻が不要なら Date を使う

締切・契約日・生年月日・賞味期限など、カレンダー日だけで足りる場合は fields.Date を選んでください。DateTimeを使うと不要なタイムゾーン処理が入り、サーバー設定次第では日付が一日ずれるバグを引き起こします。

2. 適切なデフォルトを設定する

"期待納期" や "フォローアップ日" のようなフィールドは、today や today+数日 をデフォルトにすると入力の手間が減ります。Pythonでは default=fields.Date.today と関数参照を渡すことで、レコード作成時に動的に評価される現在日付を設定できます。

3. レポートやフィルタに使う日付はインデックス化する

未払い請求や更新予定、期限切れアラートなど、頻繁に日付で絞り込むフィールドには index=True を付けましょう。大規模データでの検索パフォーマンスが劇的に改善します。

4. 複製時に持ち越したくない日付は copy=False にする

契約開始日や有効期限などはレコード複製時に古い日付がそのまま流用されるとミスの元です。copy=False を設定して複製後に明示的に日付を入れさせる運用が安全です。

5. 開始日と終了日の組は必ず制約を付ける

Start/End のような開始・終了のペアには @api.constrains を使って終了日が開始日より前にならないようチェックを入れてください。後からバグの温床になるデータ品質問題を予防できます。

よくある落とし穴


Date と DateTime を混同すること

これがOdooで時間関連データを扱う際に最も多いミスです。DateTimeはUTCで保存し表示時に変換されるため、時間差のあるユーザー間で日付がずれることがあります。単に日付だけで良いならDateを選びましょう。

常に用途に見合った最もシンプルな型を選ぶことが重要です。

スケジュール処理でサーバーの時刻帯を考慮していないこと

scheduled action や日付を基準にした集計で fields.Date.today() を使う場合、これはサーバー側のUTC日付を返します。分散チームやサーバーと現地時刻が大きくずれる場合は、日付のずれが出ることがあるので、多地域でテストすることをお勧めします。

日付ペアに対する制約の欠如

開始日と終了日が別フィールドになっているだけで、終了日が開始日より前でも許されている実装をよく見かけます。これが原因で期間計算や集計が崩れるため、必ずサーバー側の制約を入れてください。

フィルタに使う日付にインデックスを付け忘れること

"期限切れ" や "近日の締切" などを表示するフィルタは日付比較を多用します。インデックスがないと毎回フルテーブルスキャンになり、請求書や在庫移動など大量レコードを持つモデルではパフォーマンス低下が顕著になります。

日付を文字列(Char)で保存すること

表示フォーマットを保ちたい、プルダウンを避けたいなどの理由で日付を文字列で保存すると、並び替え・比較・算術・レポートが壊れます。必ず fields.Date 型を使ってください。フレームワークとDBが表示・ローカライズを自動で処理します。

よくある質問(FAQ)


Q: Odooでの Date と DateTime の違いは何ですか?

A: Date は年月日のみを保持し時刻を持ちません。DateTime は時刻まで含む完全なタイムスタンプをUTCで保存し、表示時にユーザーのタイムゾーンに変換されます。業務上時刻が不要なら Date を選択してください。

Q: 日付フィールドのデフォルトを常に今日にするには?

A: Pythonでは default=fields.Date.today と関数参照を指定します(括弧は付けない)。これによりレコード作成時にその時点の現在日が設定されます。Studioではフィールド設定で「Today」を選択します。

Q: 他のフィールドから日付を計算して設定できますか?

A: 可能です。compute='_compute_my_date' とし、@api.depends() で再計算トリガーとなるフィールドを指定したメソッド内で datetime.date や timedelta を使って計算します。検索や集計に使うなら store=True を付けてDB保存してください。

Q: ドメインで日付範囲を指定するには?

A: 標準の比較演算子を使います。例:2026年3月分のレコードを抽出するドメインは次のようになります。

[
    ('x_date_field', '>=', '2026-03-01'),
    ('x_date_field', '<=', '2026-03-31')
]

ドメイン内の日付は常にISO形式(YYYY-MM-DD)で指定してください。

Q: 条件付きで日付フィールドを必須にできますか?

A: 表示上はビューの attrs で条件付き必須表示が可能ですが、サーバー側の強制は Python の @api.constrains を用いたバリデーションが必要です。Studioの条件ルールは簡易的な代替手段になります。

まとめ


日付フィールドはOdooで最も実務的に役立つフィールド型の一つです。理解しやすく使いやすい一方で、正しく設計すればリマインダーや期限チェック、期日ベースのレポーティングなど重要な業務ロジックを支える力を持ちます。

要点をまとめると:時刻が不要な場合は Date を使う、デフォルトやインデックスの設定で使い勝手と性能を向上させる、開始・終了のペアには必ず制約を付ける、の3点が重要です。

Odooで堅牢なデータモデルを作る最初の一歩は、こうした小さな設計判断の積み重ねにあります。日付フィールドはその基礎を支える重要な要素です。

Dasoloでは、部門横断の業務プロセスに対応したOdooの導入・カスタマイズ・最適化支援を行っています。データモデル設計、カスタムフィールドやワークフロー追加、モジュール開発まで幅広くサポートします。 ぜひお気軽にお問い合わせください。 あなたのOdooプロジェクトについてお話しましょう。

OdooのDate Fieldを徹底解説:使い方・設定・注意点まとめ
Dasolo 2026年3月6日
このポストを共有
サインイン コメントを残す