第 3 章:モデルと基本フィールド¶
:doc:`前の章<02_newapp>の最後に、Odooモジュールを作成することができました。 しかし、現時点ではまだ空のシェルであり、データを保存することはできません。 私たちの不動産モジュールでは、プロパティ(名前、説明、価格、リビングエリア)に関連する情報を保存したいと考えています。 .. データベース内。Odoo フレームワークは、データベースの相互作用を促進するツールを提供します。
実習を進める前に、 estate
モジュールがインストールされていることを確認してください。つまり、アプリリストに Installed
(インストール済み)と表示されていなければなりません。
警告
変更可能なグローバル変数を使用しないでください。
1つのOdooインスタンスは、同じPythonプロセス内で複数のデータベースを並列実行できます。 それぞれのデータベースに固有のモジュールがインストールされる可能性があるため、インストールされているモジュールによって更新されるグローバル変数には依存できません。
オブジェクト-リレーショナルマッピング¶
参考: このトピックに関連するドキュメントは、 モデル APIにあります。
注釈
目標: このセクションの最後には、テーブル estate_property
が作成されていることになります。
$ psql -d rd-demo
rd-demo=# SELECT COUNT(*) FROM estate_property;
count
-------
0
(1 row)
Odooの重要なコンポーネントは ORM 層です。このレイヤーは、ほとんどの SQL を手動で記述することを回避し、拡張性とセキュリティサービス2 を提供します。
ビジネスオブジェクトは Model
を拡張したPythonクラスとして宣言され、自動化された永続化システムに統合されます。
モデルは、その定義に属性を設定することで構成することができます。最も重要な属性は _name
で、これは必須であり、Odooシステムでのモデルの名前を定義します。ここでは、モデルの最小限の定義を示します。
from odoo import models
class TestModel(models.Model):
_name = "test_model"
この定義はORMが`test_model`という名前のデータベーステーブルを生成するのに十分です。 全てのモデルは models
ディレクトリにあり、それぞれのモデルは Python ファイルで定義されています。
crm_recurring_plan
テーブルがどのように定義され、対応するPythonファイルがどのようにインポートされるかを見てみましょう。
モデルは
crm/models/crm_recurring_plan.py
というファイルに定義されています( こちら を参照)。crm_recurring_plan.py
は、crm/models/__init__.py
でインポートされています( こちら を参照)。フォルダ
models
はcrm/__init__.py
でインポートされています( こちら を参照)。
Exercise
不動産のプロパティモデルを定義してみてください。
CRMモジュールで示されている例に基づいて、 estate_property
テーブルのための適切なファイルとフォルダを作成してみてください。
ファイルを作成したら、 estate.property
モデルに最小限の定義を追加します。
Pythonファイル変更の反映には、Odooサーバーの再起動が必要です。サーバーの再起動時には、パラメータ -d
と -u
を追加します。
$ ./odoo-bin --addons-path=addons,../enterprise/,../tutorials/ -d rd-demo -u estate
-u estate
は、 estate
モジュールをアップグレードしたいことを意味します。この場合、新しいテーブルが作成されます。 -d rd-demo
は、アップグレードが rd-demo
データベース上で実行されることを意味します。 -u
は常に -d
と組み合わせて使用する必要があります。
起動時には次のような警告が表示されます。
...
WARNING rd-demo odoo.models: The model estate.property has no _description
...
WARNING rd-demo odoo.modules.loading: The model estate.property has no access rules, consider adding one...
...
If this is the case, then you should be good! To be sure, double check with psql
as demonstrated in
the Goal.
Exercise
説明を追加してみましょう。
モデルに _description
を追加して、警告の1つを取り除いてください。
モデルフィールド¶
参考: このトピックに関連するドキュメントは、 フィールド APIにあります。
フィールドは、モデルが何を保存できるか、どこに保存するかを定義するために使われます。フィールドはモデルクラスの属性として定義されます。
from odoo import fields, models
class TestModel(models.Model):
_name = "test_model"
_description = "Test Model"
name = fields.Char()
name
フィールドは Char
ですが、これは、Pythonの unicode である str
とSQLの VARCHAR
で表現されます。
型¶
注釈
目標: このセクションの終わりには、いくつかの基本的なフィールドがテーブル estate_property
に追加されていることになります。
$ psql -d rd-demo
rd-demo=# \d estate_property;
Table "public.estate_property"
Column | Type | Collation | Nullable | Default
--------------------+-----------------------------+-----------+----------+---------------------------------------------
id | integer | | not null | nextval('estate_property_id_seq'::regclass)
create_uid | integer | | |
create_date | timestamp without time zone | | |
write_uid | integer | | |
write_date | timestamp without time zone | | |
name | character varying | | |
description | text | | |
postcode | character varying | | |
date_availability | date | | |
expected_price | double precision | | |
selling_price | double precision | | |
bedrooms | integer | | |
living_area | integer | | |
facades | integer | | |
garage | boolean | | |
garden | boolean | | |
garden_area | integer | | |
garden_orientation | character varying | | |
Indexes:
"estate_property_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
"estate_property_create_uid_fkey" FOREIGN KEY (create_uid) REFERENCES res_users(id) ON DELETE SET NULL
"estate_property_write_uid_fkey" FOREIGN KEY (write_uid) REFERENCES res_users(id) ON DELETE SET NULL
フィールドには2つの大まかなカテゴリがあります。モデルのテーブルに直接格納されるアトミック値である 単純な
フィールドと、(同じモデルまたは異なるモデルの) レコードをリンクする リレーショナル
フィールドです。
単純なフィールドの例としては、 Boolean
や、 Float
、 Char
、 Text
、 Date
、 Selection
があります。
Exercise
不動産物件のテーブルに基本的なフィールドを追加してみましょう。
次の基本フィールドをテーブルに追加します
フィールド |
型 |
---|---|
名前(name) |
文字 |
説明 |
テキスト |
郵便番号 |
文字 |
date_availability |
日付 |
expected_price |
フロート |
selling_price |
フロート |
ベッドルーム |
整数 |
living_area |
整数 |
ファサード |
整数 |
ガレージの |
Boolean |
庭園 |
Boolean |
garden area |
整数 |
garden_orientation |
選択 |
garden_orientation
フィールドは、 'North', 'South', 'East' そして 'West' といった選択可能な4つの値を持つ必要があります。選択リストはタプルのリストとして定義しますが、その例は こちら を参照してください。
モデルにフィールドを追加したら、 -u estate
でサーバーを再起動します。
$ ./odoo-bin --addons-path=addons,../enterprise/,../tutorials/ -d rd-demo -u estate
psql
に接続し、estate_property
テーブルの構造を確認します。 テーブルには、いくつかの追加フィールドも追加されていることがわかります。それについては後ほど説明します。
一般ステータス¶
注釈
目標: このセクションの終わりには、テーブル estate_property
の name
と expected_price
の列が not nullable になっていなければなりません。
rd-demo=# \d estate_property;
Table "public.estate_property"
Column | Type | Collation | Nullable | Default
--------------------+-----------------------------+-----------+----------+---------------------------------------------
...
name | character varying | | not null |
...
expected_price | double precision | | not null |
...
モデル自体と同様に、フィールドにも構成属性をパラメータとして渡すことで設定できます。
name = fields.Char(required=True)
すべてのフィールドで利用可能な属性がいくつかあります。最も一般的な属性は次のとおりです。
string
(str
, default: field's name)ユーザーが表示するUI内のフィールドのラベル。
required
(bool
, default:False
)True
の場合、フィールドは空にできません。デフォルト値を持つか、レコード作成時に必ず値を与える必要があります。help
(str
, default:'
)UIでユーザーに長文のヘルプツールチップを提供します。
index
(bool
, default:False
)Odoo が列に Database index を作成するよう要求します。
Exercise
既存のフィールドに属性を設定しましょう。
次の属性を追加してください。
フィールド |
属性 |
---|---|
名前(name) |
必須 |
expected_price |
必須 |
サーバーを再起動すると、どちらのフィールドもnullableではなくなります。
自動採番項目¶
参考: このトピックに関連するドキュメントは、 自動フィールド にあります。
モデルには、定義していないのに、いくつかのフィールドが存在することに気付いたかもしれません。Odooは全てのモデルにいくつかのフィールドを作成します1 。これらのフィールドはシステムによって管理されており、書き込むことはできませんが、有用性や必要性があれば読むことができます。
id
(Id
)モデルのレコードを一意にする識別子です。
create_date
(Datetime
)レコードの作成日
create_uid
(Many2one
)レコードを作成したユーザー
write_date
(Datetime
)レコードの最終更新日。
write_uid
(Many2one
)レコードを最後に修正したユーザー。
最初のモデルを作成したので、 :doc:`いくつかのセキュリティ <04_securityintro>を追加しましょう!
- 1
it is possible to disable the automatic creation of some fields
- 2
素のSQLクエリを書くことは可能ですが、Odooの認証およびセキュリティメカニズムを全てバイパスしてしまうため、注意が必要です。