在管理远程主机的应用程序中,我有一个 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()
对象。 - 它要求基础模型了解扩展它们的模型。
所以,任何关于更好/更清洁的方法来实现这一点的建议都将受到欢迎!