Django中的单表继承
-
04-07-2019 - |
题
Django中是否明确支持单表继承?最后我听说,这个特征仍处于开发和辩论之中。
我是否可以在此期间使用图书馆/黑客来捕获基本行为?我有一个混合不同对象的层次结构。具有Employee类的公司结构的规范示例,雇员类型的子类以及manager_id(parent_id)将是我正在解决的问题的良好近似。
在我的情况下,我想表达一个想法,即员工可以在由其他员工管理的同时管理其他员工。 Manager和Worker没有单独的类,这使得这很难跨表传播。子类将代表员工类型 - 程序员,会计师,销售等,并且独立于谁监督谁(好吧,我想它在某些方面不再是典型的公司)。
其他提示
我认为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