Django中是否明确支持单表继承?最后我听说,这个特征仍处于开发和辩论之中。

我是否可以在此期间使用图书馆/黑客来捕获基本行为?我有一个混合不同对象的层次结构。具有Employee类的公司结构的规范示例,雇员类型的子类以及manager_id(parent_id)将是我正在解决的问题的良好近似。

在我的情况下,我想表达一个想法,即员工可以在由其他员工管理的同时管理其他员工。 Manager和Worker没有单独的类,这使得这很难跨表传播。子类将代表员工类型 - 程序员,会计师,销售等,并且独立于谁监督谁(好吧,我想它在某些方面不再是典型的公司)。

有帮助吗?

解决方案

Django目前有两种形式的继承--MTI(模型表继承)和ABC(抽象基类)。

我写了教程了解幕后发生的事情。

您还可以参考模型继承的官方文档

其他提示

我认为OP正在询问单表继承为此处定义

  

关系数据库不支持继承,因此当从对象映射到数据库时,我们必须考虑如何在关系表中表示我们的良好继承结构。映射到关系数据库时,我们尝试最小化在多个表中处理继承结构时可以快速挂载的连接。单表继承将继承结构的所有类的所有字段映射到单个表中。

即,整个实体类层次结构的单个数据库表。 Django不支持这种继承。

看我的尝试:

http://djangosnippets.org/snippets/2408/

  

“每个层次结构的表”的仿真。 a.k.a.“单表继承”在Django。基类必须包含所有字段。它的子类不允许包含任何其他字段,并且最佳它们应该是代理。

不完全是“单表继承”,但在很多情况下足够接近。

我认为你可以做类似的事情。

我必须自己实现这个问题的解决方案,这就是我解决它的方法:

class Citrus(models.Model)
    how_acidic = models.PositiveIntegerField(max_value=100)
    skin_color = models.CharField()
    type = models.CharField()

class TangeloManager(models.Manager)
    def get_query_set(self):
        return super(TangeloManager, self).get_query_set().filter(type='Tangelo')

class Tangelo(models.Model)
    how_acidic = models.PositiveIntegerField(max_value=100)
    skin_color = models.CharField()
    type = models.CharField()
    objects = TangeloManager()
    class Meta:
        # 'appname' below is going to vary with the name of your app
        db_table = u'appname_citrus'

这可能有一些锁定问题......我不确定django是如何解决这个问题的。此外,我没有真正测试上面的代码,它完全是为了娱乐目的,希望能让你走上正轨。

这可能有用: https://github.com/craigds/django-typed- 的车型 它看起来有点像单表继承的实现,但它有一个限制,即子类不能有任何额外的字段。

还有一个fork解决了无法创建额外字段的问题: https://github.com/KrzysiekJ/django-typed-models

更新:我认为fork可能已经合并回来了

这是关于STI的django开发者邮件列表的最新讨论: https://groups.google.com/forum/#! MSG / django的开发人员/ -UOM8HNUnxg / 6k34kopzerEJ

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top