0

Elmasri & Navathe の「Fundamentals of database systems」で説明されているように、DB 設計に階層を作成したいと考えています。

これは、多くのクラス/テーブルで共有される情報がある場合、それをメインの親テーブルに配置し、メインのテーブル ID を子テーブルの外部キーとして使用できることを意味します。これは一種の弱いエンティティです。

抽象継承とマルチテーブル継承を使用してみました (この最後のものでは、OneToOneField を指定できません。django docs でこれを見つける場所がわかりません)。

私の例はここにあります(クラスごとに1つのテーブル):

'''I would like this to be abstract, because I will never instantiate it, 
but could be not if needed'''

class Person(models.Model): 
    personId = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=45)
    surname = models.CharField(max_length=45, blank=True)
    email = models.CharField(max_length=45, blank=True)
    phone = models.CharField(max_length=15, blank=True)

    class Meta:
        managed = False
        db_table = 'person'

class Alumn(Person):
    # Maybe this one down should be OneToOne.
    # alumnId == personId always true for the same real world guy
    alumnId = models.ForeignKey('Person', db_column='alumnId', primary_key=True) 

    comments = models.CharField(max_length=255, blank=True)

class Meta:
    managed = False
    db_table = 'alumn'

# There are more child classes (Client, Professor, etc....) 
# but for the example this is enough

私の目標は、次のような 2 つの文だけで DB に卒業生を作成することです。

a = Alumn(personId=1,name='Joe', [...more params...] , alumnId=1, comments='Some comments' )
a.save()

この 2 行で 2 つの行が挿入されます。1 つは Person 用、もう 1 つは Alumn 用です。ここにあるこのスニペットの alumnId 属性は省略できます。これは、常に personId と同じになるためです (前述のとおり、弱いエンティティのようです)。

私は django の初心者ですが、ドキュメンテーションを見て、abstract=True でいくつかのことを証明しましたが、成功していませ。子クラス。

選択する正しいパスはわかりませんが、データベースの設計を変更したくないことは間違いありません。助けてください。

前もって感謝します。

4

1 に答える 1