Django の 3 種類のモデル継承スタイルの使い分け

参考にしたサイト
モデルの継承
 

1. マルチテーブル継承

例えば Cake モデルと Bread モデルを作成するとします。Cake モデルも Bread モデルも持っているフィールドは、価格、製造年月日など、ほとんど同じです。そこで Product モデルを作成して、各々継承させたいと思います。

しかし、主キー id は商品番号として、Cake モデルも Bread モデルも同じ系で扱いと思います。

そのような場合は、マルチテーブル継承機能を使用します。Product モデルを作成し、それを Cake モデルと Bread モデルに継承させます。
 

2. 抽象ベースクラス

例えば Teacher モデルと Student モデルを作成するとします。Teacher も Student も持っているフィールドは、名前や生年月日など、ほとんど同じです。そこで Person モデルを作成して、各々継承させたいと思います。

しかし、Teacher モデルの主キー id と Student モデルの主キー id は、名前は同じでも違う系のフィールドです。Teacher の id (社員番号)と Student の id (学籍番号)は重複する可能性があります。

Teacher(id=100, name="田中太郎")
Student(id=100, name="伊東次郎")

上記のケースでは、マルチテーブル継承を利用した場合は、主キー重複ではじかれてしまいます。

そのような場合は、抽象ベースクラスを使用して Person モデルを作成し、それを Teacher モデルとStudent モデルに継承させます。

Teacher テーブルと Student テーブルが、それぞれ別個に作成されて、主キーが重複しても、エラーではじかれるようなことはありません。
 

3. プロキシモデル

各モデルには、モデルに対する処理を記述できます。「親モデルクラスのフィールドには手を加えずにメソッドだけを変えたいのなら、プロキシモデルを使うのがよいでしょう。」とのことです。


https://django-polymorphic.readthedocs.org/en/latest/