モジュールデータの定義

重要

このチュートリアルは、 :doc:の server_framework_101 チュートリアルの拡張です。 完了したことを確認し、このチュートリアルの演習のベースとして構築した`estate`モジュールを使用してください。

データの種類

マスター・データ

マスター・データは通常、モジュールの技術的またはビジネス的要件の一部です。つまり、モジュールが正常に動作するために必要なデータであることが多いです。このデータは、モジュールのインストール時に必ずインストールされます。

viewsactions を定義して以前に技術データに会いました。これらはマスターデータの一種です。

技術データの上に、ビジネスデータを定義することができます。例えば、 国、通貨、単位の単位だけでなく、完全な国のローカリゼーション(法的報告書、税金定義、勘定科目表)、およびはるかに...

デモ・データ

モジュールが正常に動作するための要件であるマスターデータに加えて、デモ目的でデータを持つことも好みます。

  • 営業担当者が彼らのデモを迅速にするのを助けます。

  • 開発者が新機能をテストし、新機能が追加されていない可能性のあるデータでどのように見えるかを確認できるように、一連の作業データを用意してください。

  • データが正しく読み込まれ、エラーが発生しないことをテストする。

  • 新しいデータベースを作成するときに使用する機能のほとんどをすばやく設定します。

デモデータは、サーバーを起動したときに自動的に読み込まれます。 これはデータベースマネージャまたはコマンドラインで行うことができます。

$ ./odoo-bin -h
Usage: odoo-bin [options]

Options:
--version             show program's version number and exit
-h, --help            show this help message and exit

Common options:
  [...]
  --without-demo=WITHOUT_DEMO
                      disable loading demo data for modules to be installed
                      (comma-separated, use "all" for all modules). Requires
                      -d and -i. Default is none
[...]

$ ./odoo-bin --addons-path=... -d db -i account --without-demo=all

データの宣言

マニフェスト

参照: このトピックに関連するドキュメントは、 モジュールマニフェスト にあります。

データはCSVまたはXMLで宣言されます。データを含む各ファイルは、それらがロードされるマニフェストに追加される必要があります。

新しいデータを追加するためにマニフェストで使用するキーは、マスター データの data と デモデータの demo です。 両方の値は、データを宣言するファイルへの相対パスを表す文字列のリストでなければなりません。

通常、デモデータは demo フォルダにあり、ビューとアクションは views フォルダにあります。 セキュリティ関連のデータは security フォルダにあり、その他のデータは data フォルダにあります。

作業フォルダーのツリーが次のようになっている場合:

estate
├── data
│   └── master_data.xml
├── demo
│   └── demo_data.xml
├── models
│   ├── *.py
│   └── __init__.py
├── security
│   └── ir.model.access.csv
├── views
│   └── estate_property_offer_views.xml
├── __init__.py
└── __manifest__.py

マニフェストは次のようになります:

# -*- coding: utf-8 -*-

{
    "name": "Real Estate",
    "depends": [
        ...
    ],
    "data": [
        "security/ir.model.access.csv",  # CSV and XML files are loaded at the same place
        "views/estate_property_offer_views.xml",  # Views are data too
        "data/master_data.xml",  # Split the data in multiple files depending on the model
    ],
    "demo": [
        "demo/demo_data.xml",
    ]
    "application": True,
}

CSV形式

参照: このトピックに関連するドキュメントは、 CSVデータファイル にあります。

シンプルなデータを宣言する最も簡単な方法は、CSV形式を使用することです。 しかし、これは機能の面では限られています。シンプルなモデルの長いリストのために使用しますが、そうでなければXMLを好みます。

id,field_a,field_b,related_id:id
id1,valueA1,valueB1,module.relatedid
id2,valueA2,valueB2,module.relatedid

ちなみに

お使いのIDEには、CSVファイルのシンタックスハイライトを行う拡張機能があると思います。

Exercise

estate モジュールに標準的な不動産物件タイプをいくつか追加してみましょう: 住宅(Residential)、商業(Commercial)、工業(Industrial)、土地(Land)。これらは常にインストールしておく必要があります。

XML形式

参照: このトピックに関連するドキュメントは、 データファイル にあります。

作成するデータがより複雑な場合、XML で作成するのに役立つ、または必要な場合もあります。

<odoo>
  <record id="id1" model="tutorial.example">
    <field name="field_a">valueA1</field>
    <field name="field_b">valueB1</field>
  </record>

  <record id="id2" model="tutorial.example">
    <field name="field_a">valueA2</field>
    <field name="field_b">valueB2</field>
  </record>
</odoo>

Exercise

`estate`モジュールのデモ・データを作成してみましょう。

フィールド

名前(name)

大きなヴィラ

トレーラーホーム

状態

新規

取消済

説明

素敵で大きなヴィラ

トレーラーパーク内のホーム

郵便番号

12345

54321

date_availability

2020-02-02

1970-01-01

expected_price

1,600,000

100,000

selling_price

120,000

ベッドルーム

6

1

living_area

100

10

ファサード

4

4

ガレージの

True

False

庭園

True

garden area

100000

garden_orientation

South

データの拡張

コアトレーニング中、 :doc:の `server_framework_101/12_inherited from の章で既存のビューを継承することができました。 これはデータ拡張の特殊なケースで、モジュール内で任意のデータを拡張することができます。

新しいモジュールで既存のモデルに新しいフィールドを追加するとき、依存しているモジュールで作成されたレコードにそれらのフィールドを入力したい場合があります。これは、拡張したいレコードの xml_id を与えることで行います。置き換えられるわけではありませんが、この場合は両方のレコードの field_c に与えられた値を設定します。

<odoo>
  <record id="id1" model="tutorial.example">
    <field name="field_c">valueC1</field>
  </record>

  <record id="id2" model="tutorial.example">
    <field name="field_c">valueC2</field>
  </record>
</odoo>

ref

関連フィールドは、 ref キーを使って設定することができます。このキーの値は、リンクさせたいレコードの xml_id です。 xml_id は、データが最初に宣言されたモジュールの名前、ドット、レコードの id の順で構成されていることを覚えておいてください (データを宣言したモジュール内にある場合は、 id だけでも動作します) 。

<odoo>
  <record id="id1" model="tutorial.example">
    <field name="related_id" ref="module.relatedid"/>
  </record>
</odoo>

Exercise

作成した物件情報のオファーのデモ・データを作成してみましょう。

base で定義されたパートナーを使用してオファーを作成してみましょう。

パートナー

不動産

価格

有効期間

Azure Interior

大きなヴィラ

10000

14

Azure Interior

大きなヴィラ

1500000

14

デコ ・ アディクト

大きなヴィラ

1500001

14

Exercise

format@@0がformat@@1に設定されているデモのプロパティが両方とも作成されていることを確認します。

eval

フィールドに割り当てる値は必ずしも単純な文字列ではなく、計算する必要があるかもしれません。 また、関連する値の挿入を最適化するため、またはバッチ内に関連する値を追加する制約があるために使用することもできます。 参照::ref:`Add X2lot fields <tutorials/define_module_data/x2m> ` 。

<odoo>
  <record id="id1" model="tutorial.example">
    <field name="year" eval="datetime.now().year+1"/>
  </record>
</odoo>

Exercise

追加したオファーは、常にモジュールのインストール時に対して、相対的な日付となるようにしてみましょう。

function

また、データをロードする際にPythonコードを実行する必要があるかもしれません。

<function model="tutorial.example" name="action_validate">
    <value eval="[ref('demo_invoice_1')]"/>
</function>

Exercise

デモデータのオファーのうち1つを "Accept Offer" ボタンを使って検証済みにしてみましょう。その他は拒否します。

X2many フィールドへの追加

参考: このトピックに関連するドキュメントは、 Command にあります。

One2multiまたはMany2multiのフィールドに関連データを追加する必要がある場合は、 Command メソッドを使用します。

<odoo>
  <record id="id1" model="tutorial.example">
    <field name="related_ids" eval="[
        Command.create({
            'name': 'My name',
        }),
        Command.create({
            'name': 'Your name',
        }),
        Command.link(ref('model.xml_id')),
    ]"/>
  </record>
</odoo>

Exercise

1つの新しいプロパティを作成しますが、今回はオファーにリンクされているOne2multiフィールド内に直接作成されたオファーがあります。

データへのアクセス

警告

デモ・データとして宣言されていないデモ・データには、テストであっても絶対にアクセスしてはいけません。

マスター/デモ・データにアクセスする方法は複数あります。

Pythonコードでは、 env.ref(self, xml_id, raise_if_not_found=True) メソッドを使用できます。このメソッドは、指定した xml_id にリンクされたレコードセットを返します。

XML では、次のように ref キーを使用できます。

<odoo>
  <record id="id1" model="tutorial.example">
    <field name="related_id" ref="module.relatedid"/>
  </record>
</odoo>

refメソッドが呼び出され、 id1 を持つ tutorial.example 型のレコードのフィールド related_id に、返されたレコードのidが格納されます。

CSVでは、カラムのタイトルの末尾に :id または /id を付ける必要があります。

id,parent_id:id,name
"child1","module.parent","Name1"
"child2","module.parent","Name2"
"child3","module.parent","Name3"

SQLでは、 :ref:`the advanced section <tutorials/define_module_data/xml_id> `を参照してください。

警告

データは常にユーザーによって削除される可能性があります。この点を考慮して、常に防御的なコーディングを行いましょう。

上級者向け

XML idとは?

データベースのすべてのSQLテーブルに xml_id というカラムを入れたくないので、それを格納する仕組みが必要です。これは、 ir.model.data モデルで行なわれます。

このモデルには、レコードの名前(xml_id) 、定義されているモジュール、定義されているモデル、そしてレコードのidが含まれています。

アップデート不要

noupdate フラグで作成されたレコードは、そのレコードを作成したモジュールをアップグレードしても更新されませんが、まだ存在していない場合は作成されます。

注釈

odoo-bin -i module はこの設定をバイパスし、常にデータをロードします。しかし、通常は本番のデータベースでこのようなことをすべきではありません。

<odoo noupdate="1">
  <record id="id1" model="model">
    <field name="fieldA" eval="True"/>
  </record>
</odoo>

SQLとして取り込む

場合によっては、SQLで直接インポートを行うことも可能です。しかし、これはORMの全ての機能、計算されたフィールド(メタデータを含む) とpythonの制約をバイパスするため、推奨されません。

注釈

一般的に生のSQLを使用すると、ACLがバイパスされ、インジェクションのリスクが高まります。

参照: Odooにおけるセキュリティ