Modelメソッド

Modelメソッド

Djangoのmodels.pyのClassには、自作した関数を定義することができ、Modelメソッドと呼ばれます。
Djangoでは、ほとんどの場合データを取り扱うロジックなどはviews.pyで扱います。フロントエンドでのtemplatesでも扱うことができますが、実は可能な場合はmodelsでロジックを組むのが最も推奨されています。

このロジックは、models.pyのClassに定義することができ、Modelメソッドと呼ばれます。

ロジックを組む時の推奨順

  1. models.py
  2. views.py
  3. templates

自作関数

データに関するプログラムであれば、models.pyのClassに自作関数を定義することができます。
defを追加することでこれを定義できます。


class Article(models.Model):

    title = models.CharField(max_length=100)

    def get_title_length(self):
        return len(self.title)

この場合、Articleのget_title_lengthを呼ぶことで、Articleのtitleの文字カウントを行うことができます。

以下はviews.pyでModelメソッドを使わずに文字カウントを行う場合です。

views.py


latest_article = Article.objects.all().latest()

title = latest_article.title
title_length = len(latest_article)

Modelメソッドの自作関数を使うと以下のように実装できます。


latest_article = Article.objects.all().latest()

title_length = latest_article.get_title_length()

関数化する最大のメリットは同じコードを書くケースを減らせることです。
Djangoの思想の一つに
DRY(Don’t Repeat Yourself)
同じプログラムを書かない
というものがあります。

Modelメソッドを定義してしまえばあとはクエリから関数を呼ぶだけでプログラムを実行できるので、コードを一箇所にまとめることができるというわけです。

既存の関数をオーバーライド

models.pyでClassを作成すると、デフォルトで関数が作成されます。
これはDjangoの内部で定義されているわけですが、これをオーバーライドしてプログラムを組み込むことも可能です。


class Article(models.Model):

    title = models.CharField(max_length=100)

    def save(self, *args, **kwargs):
        if self.title == "hoge":
            raise Exception("hoge以外の文字を入力してください。")
        else:
            return super().save(*args, **kwargs)

ここでは、デフォルトで定義されるsave関数をオーバーライドして、hogeのデータが入ってきたときにエラーを吐き出す処理を加えています。
save関数はModelのデータが保存されるときに自動で走る関数です。
データが保存されるときに処理を加えたい場合は、このsave関数をオーバーライドすると良いでしょう。

else以降で呼び出してるsuper()はここではArticle Classを指します。
ここではArticle Classのsave()関数を呼び出しています。

デフォルトのModelメソッドは他にもたくさんあり、このsave()やdelete()がよく使用されます。

Modelメソッドは使いこなすことができると冗長なコードになるのを防ぐことができ、プロダクト開発を進める上で運用もすごく楽になります。
ケースバイケースで使いこなせていけると良いでしょう。