Djangoのモデル継承とポリモーフィズムについて

django Python Published at Feb. 28, 2025, 4:10 p.m. by admin@senrigan.org

Djangoのモデル継承読んでて、ポリモーフィズムについて理解できそうな気がした

Djangoでサポートされている3つのモデル継承の特徴

抽象基底クラス マルチテーブル継承 プロキシモデル
Meta abstract=True proxy=True
テーブルの作成 親と子
リレーション OneToOneField
ユースケース フィールドの共有 ポリモーフィズム メソッド追加

ポリモーフィズムって

  1. インターフェースは単一
  2. 異なる型のオブジェクトを統一的に扱う

ことなので、

抽象基底クラス

親クラスの型については知る由もないのでポリモーフィズムとは直接関係がない。


マルチテーブル継承

親クラスのインスタンスを生成すると、自動的に子クラスのインスタンスにもアクセスできるので、ポリモーフィズムを実現できる。

キーワードは、OneToOneFieldGenericForeignKeyContentType

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テーブルを作る必要はないけど、既存のモデルにメソッド生やしてモデルの振る舞いだけ変えたい、というときに使うみたい。

参考:モデルの継承