使用django多表继承

时间:2015-10-29 09:54:51

标签: python django python-3.x inheritance django-models

我正在尝试构建一个django界面,以帮助管理和配置公司基础架构中的资源。我试图将多态性用于"资源提供者"。

的概念

方案

以下是一些可以很好地代表方案的存根模型:

资源模型(由一个应用程序提供):

class Resource(models.Model):
    """
    Representation of the physical resource
    """
    pass

资源提供者的抽象(由第二个应用程序提供):

class Provider(models.Model):
    """
    Representation of a service provider that can provide resources
    """
    id = models.SlugField(max_length=32, primary_key=True)


class ResourceProvider(models.Model):
    """
    'Abstract' class for a provider of the resource represented by Resource
    """
    provider = ForeignKey(Provider, null=False)
    provides = ForeignKey(ServerImage, null=False)

    class Meta:
        unique_together = ('provider', 'provides')

个人资源提供者(由许多应用提供 - 每个提供商一个)

class ServiceResource(ResourceProvider):
    """
    Representation of the resource on a particular
    """
    service_identifier = models.UUIDField(null=False)

问题

各个应用如何注册为提供商?

每个提供资源的应用都应该通过一些身份识别来识别。此注册应在Provider模型中进行,然后由ServiceResource用作provider字段。

我可能会在Provider(id='some-provider').save()文件的顶部调用models.py,但我不觉得这是最好的方法,导致每次更新表格{已加载{1}}。

另一种方法是手动向迁移文件添加一行,但我觉得这是错误的,有点hacky。可能有一种django的做法,我还没有发现。我希望可能有一个正确的'预先填充表格的方式。

如何使ServiceResource始终使用应用程序各自的提供者值?

我能想到的三种方式是:

  1. 将其声明为对象的一部分(不要认为这会有效,因为这会使models.py实例掩盖provider,而不是创建引用Provider <的ForeignKey / LI>

    Provider(id='service-provider')

    1. 初始化对象时设置它。虽然不推荐,但我可以覆盖class ServiceResource(ResourceProvider): provider = Provider(id='service-provider') 方法并在那里设置值/将其添加到__init__,然后再传递给父构造函数。

    2. 创建一个创建对象的静态方法 - 这感觉就像保证一点点,人们可以打破预期的格式。 django管理员会使用这个吗?

    3. 我希望我想要实现的目标是有道理的。如果我可以提供更多细节或示例,或者有任何不清楚的地方,请发表评论,我将回复或更新问题。

0 个答案:

没有答案