初めに
本記事はすでにodooのインストール方法など、環境構築ができている前提で話を進めるとします。
odoo moduleの継承について
odooの一つの強力な機能はその他のモジュールを継承して実現するプロセスが可能だということです。既存のモジュールに則って修正をかけて、異なるレイヤーにて修正をかけられます。ビュー、業務ロジック、モデルなどのレイヤーにてできます。
__manifest__.py
のdependsについて
__manifest__.py
ファイルにあるdependsは依頼関係を示したものです。dependsに入れたモジュールの意味合いは大体以下の2パターンがあります。
- 既存モジュールの元で新たな外観および機能を拡張したい。
- 既存モジュールの外観および機能を変更したい。
ワンポイント:
- 例1:odooモジュールがあるとします。何か修正・拡張をしたいときに、todoモジュールでファイルを修正するのではなく、新たなモジュールを作成して、odooが提供しているモジュールに対して二次開発をするということになります。(ソースコードに修正をかけるのは避けたい)
- 例2:自作モジュールに対して修正をかけたい場合はモジュールにてそのまま修正する方法と、新たなモジュールを作成して継承するという方法もあります。
モジュールにおけるモデル継承
モデルの継承については、通常は新たなフィールドを追加する、新たなフィールドの属性の追加、新たなモデルの追加といった方法があります。
モデル継承時、使わなければならないのは_inherit
というコードです。(_inherit/_name/_inheritsなどの違いはあります)
from odoo import api, fields, models, _
class ZeroneShelf(models.Model):
_inherit = "zerone.shelf"
description = fields.Text(string="シェルフ情報")
上記の方法は、descroption
というフィールドを追加。
以下の方法はsay_hello()というメソッドを追加。
# メソッドを追加
class ZeroneShelf(models.Model):
_inherit = "zerone.shelf"
description = fields.Text(string="シェルフ情報")
name = fields.Char(string="名称", size=32)
def say_hello(self):
print("hello")
# メソッドを書き換える
#2パターンがあります。
#第1:そのままコピーして持ってきて書き換える
#第2:superを入れて書き換える→以下はこれを試す
class ZeroneShelf(models.Model):
_inherit = "zerone.shelf"
description = fields.Text(string="シェルフ情報")
name = fields.Char(string="名称", size=32)
def say_hello(self):
print("hello")
#書き換えるメソッドだよ
def write(self, vals):
res = super(ZeroneShelf, self).write(vals) #これはそのまま前のメソッドを持ってきた
print("これはメソッドの書き換え", vals) #ここは追加した書き換えるための内容。ここはsuperの後に書いたが、前に書いてもOKなのです。順番はニーズに合わせてOK
return res