我正在尝试设计一个框架来帮助实现复杂的Web流程。该框架将提供可以由子应用程序继承和实现的抽象类。现在,你可以看到我的抽象类Action有一个带有Stage的外键。因为,它有一个外键,它不能被抽象,因为它有自己的表。所以,如果我有2个实现应用程序,那么我的第一个应用程序可以看到所有阶段本身以及其他应用程序。我可以在查询中进行一些调整以避免这种情况。但我想知道是否有解决方案,我的实现Action类可以直接指向Inheriting Stage类。
parent_app/models.py
class Stage(models.Model):
name = models.CharField(max_length=255)
class Action(models.Model):
stage = models.ForeignKey(Stage)
class Meta:
abstract = True
sub_app1 / models.py
class StageImpl1(Stage):
pass
class ActionImpl1(Action):
...
sub_app2 / models.py
class StageImpl2(Stage):
pass
class ActionImpl2(Action):
...
目前的情况是:
ActionImpl1有一个Stage的外键
我将拥有的是:
ActionImpl1有一个带有StageImpl1的外键
答案 0 :(得分:7)
抽象类是不存在的类。它被用作其他类的基础。它永远不会被初始化。
不存在的东西不能有外键指向它!
如果您想要指出几种不同类别的方法,可以查看一些内容:generic relations。这是Django的内置方式,可以在许多不同的对象上看起来像是一个外键点。
答案 1 :(得分:2)
这是不可能的。 想想如果A是abtract并且几个类继承自A,那么外键指向A的所有类会发生什么。
我不知道您的要求,但我可能应该考虑使用多元继承,并将FK指向父表。
来自Django文档:
多表继承
https://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance
Django支持的第二种模型继承是每种类型 层次结构中的模型本身就是一个模型。每个型号 对应于自己的数据库表,可以查询和创建 个别。继承关系引入了之间的联系 儿童模型及其每个父母(通过自动创建 OneToOneField)。例如: