リモートホストを管理するアプリで、Djangoマルチテーブル モデルの継承の古典的な使用例があります。
このアプリは、一般的な "RemoteHost"、"SshHost" (これも RemoteHost)、または "EsxiHost" (これも SshHost) で動作するため、当然、複数テーブル モデルの継承を使用しました。
class RemoteHost(models.Model):
...
def shutdown(self):
raise NotImplemented()
class SshHost(RemoteHost):
...
def shutdown(self):
# run SSH shutdown command
class EsxiHost(SshHost):
...
def shutdown(self):
# shutdown running virtual machine using VMware API
SshHost(self).shutdown()
特定のホストタイプを知らなくても管理対象ホストを「シャットダウン」できるようにしたいのですがRemoteHost.objects.get(pk=1).shutdown()
、Djangoデータモデルは明示的に要求されたタイプを返すことがわかりました(私の経験とドキュメントによると)。
基本クラスのクエリセットに基づいて、利用可能な最も特殊なインスタンスを取得するクリーンな方法を探しています。
これまでのところ、私が思いついた「最もクリーンな」アプローチは次のようになります。
class RemoteHost(models.Model):
...
def get_specialized_instance(self):
try:
return self.sshhost.get_specialized_instance()
except self.DoesNotExist:
return self
class SshHost(RemoteHost):
...
def get_specialized_instance(self):
try:
return self.esxihost.get_specialized_instance()
except self.DoesNotExist:
return self
class EsxiHost(SshHost):
...
def get_specialized_instance(self):
return self
このアプローチの利点は、それが機能することです:-)
しかし、私は次の理由でそれが好きではありません。
get_specialized_instance()
オブジェクトを明示的に呼び出す using コードが必要です。- 基本モデルは、それらを拡張するモデルについて認識している必要があります。
したがって、これを達成するためのより良い/よりクリーンな方法に関するアドバイスは大歓迎です!