0

リモートホストを管理するアプリで、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

このアプローチの利点は、それが機能することです:-)

しかし、私は次の理由でそれが好きではありません。

  1. get_specialized_instance()オブジェクトを明示的に呼び出す using コードが必要です。
  2. 基本モデルは、それらを拡張するモデルについて認識している必要があります。

したがって、これを達成するためのより良い/よりクリーンな方法に関するアドバイスは大歓迎です!

4

1 に答える 1

1

Django Polymorphicは、独自の ObjectManagers を作成して ContentTypes を設定する代わりに、ここであなたの友人になることができます。ほら、ちゃんとした答え!:-)

于 2013-10-26T17:49:16.060 に答える