多くのブロックが関連付けられているページがあるとします。また、各ブロックには、カスタムのレンダリング、保存、およびデータが必要です。
コードの観点から見ると、これらのモデルごとに異なるクラス (したがってモデル) を定義するのが最も簡単です。次のように簡略化されます。
class Page(models.Model):
name = models.CharField(max_length=64)
class Block(models.Model):
page = models.ForeignKey(Page)
class Meta():
abstract = True
class BlockType1(Block):
other_data = models.CharField(max_length=32)
def render(self):
"""Some "stuff" here """
pass
class BlockType2(Block):
other_data2 = models.CharField(max_length=32)
def render(self):
"""Some "other stuff" here """
pass
しかしその後、
page.block_set.all()
このコードでも、ブロックの種類に関係なく、すべての異なるブロックを取得するようなクエリを実行できません。- 上記の理由は、各モデルが異なるテーブルを定義するためです。リンク モデルと一般的な外部キーを使用して回避することで問題を解決できますが、それでもページごとに複数のデータベース テーブル クエリが残ります。
それをモデル化する正しい方法は何でしょうか?一般的な外部キー (またはその他のもの) を何らかの方法で使用して、できれば同じデータベース テーブルにデータを格納しながら、継承パラダイムを実現できますか。
アップデート:
私のポイントは、どうすればOOPパラダイムを機能させることができるかということでした。非常に多くのifで同じ方法を使用することは、私がやりたかったことではありません。
最良の解決策は、同じモデルをインスタンス化することにより、データとその「タイプ」を保存する保存を定義する別の標準pythonクラス(できれば別のblocks.pyで)を作成することです。次に、テンプレート タグと、モデルのタイプに基づいてレンダリング、保存、およびその他のメソッドを呼び出すフィルターを作成します。