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()对象。
  2. 它要求基础模型了解扩展它们的模型。

所以,任何关于更好/更清洁的方法来实现这一点的建议都将受到欢迎!

4

1 回答 1

1

在这里, Django Polymorphic可能是您的朋友,而不是编写您自己的 ObjectManagers 和设置 ContentTypes,它会为您完成所有繁重的工作。你去,一个正确的答案!:-)

于 2013-10-26T17:49:16.060 回答