私は現在、オブジェクトの種類に応じてさまざまな特性を持つことができる 1 つのモデルを含む Django のモデルに取り組んでいます。では、哺乳動物というモデルがあるとしましょう。これは、象またはイルカのいずれかになります (それぞれ独自の特性 "tusk_length" と "flipper_length" を持ちます)。
基本的な OOP の原則は「ポリモーフィズム」を叫んでおり、私は同意する傾向があります。しかし、私は Django を初めて使用するので、Django でこれを行うのが最善の方法であるかどうかを最初に知りたいと思います。私は多くの例を聞いており、何人かの人々は特異な巨大モデルを好みます
ここで説明されているように、既に GenericForeignKeys を使用してみました: Django の GenericForeignKey をモデルのリストに制限するにはどうすればよいですか? . このソリューションは見事に機能しますが、フィルター処理ができないことと、関係が一方通行であることは気に入りません。つまり、哺乳類オブジェクトからイルカを取得できますが、イルカから哺乳類オブジェクトを取得することはできません。
そして、ここに私の2つの選択肢があります:
選択肢 A:
from django.db import models
class Mammal(models.Model):
hair_length = models.IntegerField()
tusk_length = models.IntegerField()
flipper_length = models.IntegerField()
animal_type = models.CharField(max_length = 15, choices = ["Elephant", "Dolphin"]
選択肢 B:
from django.db import models
class Mammal(models.Model):
hair_length = models.IntegerField()
class Elephant(Mammal):
tusk_length = models.IntegerField()
class Dolphin(Mammal):
flipper_length = models.IntegerField()
私が理解している選択肢 B には、すべての Elephants または Dolphins を照会して一覧表示するときに、より優れたコードが得られるという利点があります。ただし、哺乳類のリストからすべての象を取得するのは簡単ではないことに気付きました (これに対するクエリはありますか?)。クラスに animal_type を設定せずに、デフォルトはクラスに依存します。
これは、ポリモーフィズムで見られる別の問題につながります。これは、上記の例や私のアプリケーションでは発生しませんが、Dolphin オブジェクトを完全に削除せずに Dolphin オブジェクトを Elephant に編集するのは難しいということは言及する価値があります。
全体として、一般的な好みや、ポリモーフィズムを使用すべきではない大きな理由はありますか?