Djangoのモデル継承読んでて、ポリモーフィズムについて理解できそうな気がした
Djangoでサポートされている3つのモデル継承の特徴
抽象基底クラス | マルチテーブル継承 | プロキシモデル | |
---|---|---|---|
Meta | abstract=True | proxy=True | |
テーブルの作成 | 子 | 親と子 | 親 |
リレーション | OneToOneField | ||
ユースケース | フィールドの共有 | ポリモーフィズム | メソッド追加 |
ポリモーフィズムって
ことなので、
抽象基底クラス
親クラスの型については知る由もないのでポリモーフィズムとは直接関係がない。
マルチテーブル継承
親クラスのインスタンスを生成すると、自動的に子クラスのインスタンスにもアクセスできるので、ポリモーフィズムを実現できる。
キーワードは、OneToOneFieldとGenericForeignKeyとContentType
basecontent_ptrというOneToOneFieldを生成して親と子を紐付ける。
GenericForeignKeyで複数のモデルを1つのフィールドで関連付ける。例えばCommentクラスとブログのPostクラスと製品のProductクラスがあって、ユーザーはPostとProductにコメントを付けることができるとき、Commentクラスに
content_object = GenericForeignKey('content_type', 'object_id')
とすると、
Comment.objects.create(content_type=post_content_type, object_id=post.id)
Comment.objects.create(content_type=product_content_type, object_id=post.id)
みたいにそれぞれ異なるオブジェクトにコメントを付けることができる。
プロキシモデル
オブジェクトの型は親クラスと同じなので一見ポリモーフィズムに見えるけど、異なる概念みたい。新しいDBテーブルを作る必要はないけど、既存のモデルにメソッド生やしてモデルの振る舞いだけ変えたい、というときに使うみたい。
参考:モデルの継承