モジュールデータの定義¶
重要
このチュートリアルは、 :doc:の server_framework_101
チュートリアルの拡張です。 完了したことを確認し、このチュートリアルの演習のベースとして構築した`estate`モジュールを使用してください。
データの種類¶
マスター・データ¶
マスター・データは通常、モジュールの技術的またはビジネス的要件の一部です。つまり、モジュールが正常に動作するために必要なデータであることが多いです。このデータは、モジュールのインストール時に必ずインストールされます。
views と actions を定義して以前に技術データに会いました。これらはマスターデータの一種です。
技術データの上に、ビジネスデータを定義することができます。例えば、 国、通貨、単位の単位だけでなく、完全な国のローカリゼーション(法的報告書、税金定義、勘定科目表)、およびはるかに...
デモ・データ¶
モジュールが正常に動作するための要件であるマスターデータに加えて、デモ目的でデータを持つことも好みます。
営業担当者が彼らのデモを迅速にするのを助けます。
開発者が新機能をテストし、新機能が追加されていない可能性のあるデータでどのように見えるかを確認できるように、一連の作業データを用意してください。
データが正しく読み込まれ、エラーが発生しないことをテストする。
新しいデータベースを作成するときに使用する機能のほとんどをすばやく設定します。
デモデータは、サーバーを起動したときに自動的に読み込まれます。 これはデータベースマネージャまたはコマンドラインで行うことができます。
$ ./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
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
追加したオファーは、常にモジュールのインストール時に対して、相対的な日付となるようにしてみましょう。
search
¶
時には、ORMを呼び出して search
(検索)を行う必要があります。これはCSV形式では実現できません。
<odoo>
<record id="id1" model="account.move.line">
<field name="account_id" search="[
('user_type_id', '=', ref('account.data_account_type_direct_costs')),
('company_id', '=', obj().env.company.id)]
"/>
</record>
</odoo>
このコードスニペットでは、マスターデータがインストールされているローカライズに依存するため、必要となります。
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の制約をバイパスするため、推奨されません。
巨大なファイル のインポート時間を短縮することができます。
より複雑なインポートを行うには、 translations を使用します。
initialize the database が必要になることがあります。