我希望对数据库设计进行层次结构,如"数据库系统的基础知识"来自Elmasri& Navathe。
这意味着当我有一些为多个类/表共享的信息时,我可以将它放在一个主父表中,并使用主表id作为子表中的外键,这是一种弱实体。 / p>
我尝试使用抽象和多重继承(最后一个不允许我指定OneToOneField,不知道在哪里可以找到这个django docs。)
我的例子就在这里(每个班级一张桌子):
'''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
我的目标是在DB中创建一个Alumn,只有两句话:
a = Alumn(personId=1,name='Joe', [...more params...] , alumnId=1, comments='Some comments' )
a.save()
并且让这两行插入两行:一行用于Person,一行用于Alumn。这个片段中的alumnId属性可以省略,因为它总是和personId一样(我告诉你,就像一个弱实体)。
我是django的初学者,但我查看了文档,并使用abstract = True in Person证明了一些事情并且没有成功我现在想我应该搞乱 init 构造超级类的构造函数,然后构建子类。
我不知道正确的选择路径,但绝对不想改变数据库设计。请帮忙。
提前致谢。
答案 0 :(得分:1)
您的模型中不需要ID; Django自动处理它。你也不应该使用骆驼箱。换句话说:personId应该是person_id,无论如何都不需要 - 只需删除它。
一般来说,我避免使用ORM进行非抽象继承。
我真的不明白你想要达到什么目标,但我会根据你的需要建议2种方法(适用于人,校友,教授等):
<强> 1。摘要继承:
class Person:
class Meta:
abstract = True
# here you put all the common columns
然后:
class Alumni(Person):
# the other columns - specific to alumn
等
通过这样做,每个子类型的人员有一个表:Alumn,Professor等。
<强> 2。使用组合:
class Alumn:
person = models.ForeignKey(Person, null=True, related_name="alumni_at")
university = ...
class Professor:
person = models.ForeignKey(Person, null=True, related_name="professor_at")
university = ...
这样你就可以:
bob = Person.objects.create(first_name="bob", ...)
Alumn.objects.create(person=bob, university="univ 1")
Professor.objects.create(person=bob, university="univ 2")
Alumn.objects.create(person=bob, university="univ 2")