CakePHP使いがDjangoでサイトを作ってみた 〜AppModelっぽいものを作りたい〜

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
ロマサガ2の皇位継承

この記事を三行にまとめると

AppModelを自作してみたいと思います
重要なのは「abstract = True」のところ
戻って四秒で完成だ
CakePHPにはAppModelという機能がデフォルトで備わっています。モデルの処理を共通化させたりできるので、おそらくほぼ必ず使用する機能だと思うのですが、DjangoはデフォルトでAppModelに相当するようなモデルは用意されていません(たぶん)

てなことで今日はDjango用のAppModelを自作して、そのクラスを継承できるようにしてみたいと思います。



通常のモデルを用意

例えばユーザー管理するusersというテーブル用のモデルを作成します。ファイル名はusers.pyとしておきましょう。

#users.py
from django.db import models
from app.models.app_model import AppModel

class Users(AppModel) :
  id = models.IntegerField()
  name = models.CharField(max_length = 100)

いろいろ省略していますが、ファイルの中身はこんな感じです。クラスの継承元をAppModelとしています。importしておくのも忘れずに。



AppModelの作成

続いてAppModelです。ファイル名はapp_model.pyにします。

#app_model.py
from django.db import models

class AppModel(models.Model) :
  class Meta:
    abstract = True

クラスの継承自体は通常のpythonの書き方で問題ないのですが、重要なのは「abstract = True」のところ。

Djangoのモデルはデフォルトだとモデル名に対応したデータベースのテーブルを読み込もうとします。この場合のAppModelも、いわゆるCakePHP的なAppModelではないので、デフォルトだと他のモデルと同様に「appmodel」というテーブルを探しに行って「テレビもラジオもテーブルもねえ」というエラーを返してきます。実際にappmodelというテーブルを用意しておけばエラーは回避できますが、不要なテーブルを作るのもアレなので、ここではAppModelを抽象クラスにしています。抽象クラスのモデルはデータベースのテーブルを必要としません。

これで継承用のAppModelの使用が可能になります。






たいしたことではないのですが、CakePHPに慣れていると抽象クラスにするという発想が出てこないので(そもそも抽象クラスという単語自体知らんかったっす)、どうやればAppModelになるんだって一瞬戸惑う可能性はなきにしもあらずです。でも大丈夫。この記事を読んだ君なら戻って四秒で完成だ。

Djangoのモデルの継承についての詳細はドキュメントにも書いてあるので、もう少し詳しく知りたい場合はこちらを見てくだせえ。バージョンがちょい古いですが。

モデルの継承
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください