Django Application:指向抽象类的外键

时间:2012-11-27 00:50:16

标签: python django django-models

我正在尝试设计一个框架来帮助实现复杂的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的外键

2 个答案:

答案 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)。例如: