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への外部キーがあります

私が持っているものは次のとおりです。

StageImpl1で外部キーを持つActionImpl1

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でサポートされている2番目のタイプのモデル継承は、階層内の各モデルがそれ自体でモデルである場合です。各モデルは独自のデータベーステーブルに対応しており、個別にクエリおよび作成できます。継承関係により、子モデルとその各親の間にリンクが導入されます(自動的に作成されたOneToOneFieldを介して)。例えば:

于 2012-11-27T01:13:46.820 に答える