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 でいくつかのことを証明しましたが、成功していません。子クラス。
選択する正しいパスはわかりませんが、データベースの設計を変更したくないことは間違いありません。助けてください。
前もって感謝します。