1
1

More than 3 years have passed since last update.

odooモジュールの継承について

Posted at

初めに

本記事はすでに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


1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1