3

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

4

2 回答 2

7

抽象类是不存在的类。它被用作其他类的基础。它永远不会被初始化。

不存在的东西不能有外键指向它!

如果您想有一种方法可以指向几种不同的类,请看一些东西:泛型关系。这是 Django 的内置方式,可以在许多不同的对象上拥有看起来像外键点的东西。

于 2012-11-27T00:58:12.587 回答
2

这是不可能的。想想如果 A 是抽象的并且几个类从 A 继承,那么所有具有指向 A 的外键的类会发生什么。

我不知道您的要求,但我也许您应该考虑使用多表继承,并将 FK 指向父表。

从 Django 文档中:

多表继承

https://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance

Django 支持的第二种模型继承类型是层次结构中的每个模型都是单独的模型。每个模型对应自己的数据库表,可以单独查询和创建。继承关系引入了子模型与其每个父模型之间的链接(通过自动创建的 OneToOneField)。例如:

于 2012-11-27T01:13:46.820 回答