2

私のモデルの1つについて、次の概念設計を念頭に置いています。

class A(models.Model):
    ...

class B(A): #Inherits A
    fieldA = ...
    fieldB = ...

class C(A): #Inherits A
    fieldC = ...
    fieldD = ...

class D(models.Model):
    field = models.ForeignKey(A) #Here lies the problem, should store B or C

上記のモデルを前提として、DのBまたはCのいずれかに外部キーを格納したいのですが、両方には格納しません

AのMetaクラスプロパティをabstractに設定しようとしましたが、AとのForeignKey関係が許可されていませ。BまたはCではないAのインスタンスは必要ありませんが、必要に応じて、これを制限できます。保存信号での動作。

すべてのクラスが共通ベースから継承するタイプのリストから外部キーを格納できるようにする、より簡単な設計はありますか?

4

1 に答える 1

1

次の 2 つのオプションが考えられます。

  1. 外部キーの代わりに、クラスでジェネリック リレーションを使用します。D

  2. D特定のフィールドを使用してフィルタリングする必要がない場合、BまたはC現在のアプローチを続行できますが、メソッドを追加するとD、の子クラスが取得されますfield

    class D(models.Model):
        field = models.ForeignKey(A)
    
        def get_field(self):
            try:
                return self.field.b
            except B.DoesNotExist:
                pass
            try:
                return self.field.c
            except C.DoesNotExist:
                pass
    

    これには間違いなくパフォーマンスへの影響があり、投稿で述べたように、のすべてのインスタンスにまたはサブクラスAがあることを手動で確認する必要があります。明らかに、このアプローチは、多数のサブクラスを作成する場合、適切に拡張できません。BCn

于 2012-10-25T17:52:03.653 に答える