当查询Django模型的基类时,如何获取一个专门的Django模型实例?

2024-10-01 04:44:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Djangomulti-table model inheritance的典型用例,在一个管理远程主机的应用程序中。在

该应用程序可以与通用的“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数据模型将返回显式请求的类型(根据我的经验,以及the docs)。在

我正在寻找一种干净的方法来获取基于基类queryset的最专门的实例。在

到目前为止,我提出的“最干净”方法如下:

^{pr2}$

这种方法的优点是它可以工作:-)

但我不喜欢,原因如下:

  1. 它需要在对象上显式调用get_specialized_instance()的使用代码。在
  2. 它要求基本模型知道扩展它们的模型。在

因此,任何关于更好/更清洁的方法来实现这一点的建议都是受欢迎的!在


Tags: 方法模型self应用程序类型getmodeldef
1条回答
网友
1楼 · 发布于 2024-10-01 04:44:40

Django Polymorphic可能是您的朋友,它不是编写您自己的对象管理器和设置内容类型,而是为您完成所有繁重的工作。给你,一个正确的答案!:-)

相关问题 更多 >