单个模型对象可以是多个子对象的父对象吗?

时间:2015-10-02 02:41:21

标签: python django

在Django项目中,我有一个有点问题,我正在寻找最好,最强大的解决方案。我希望有一个父对象由多个可以共享父级的子级子类化。

例如,我有以下类:

class Person(models.Model):
    name = models.CharField(max_length=123)

class Farmer(Person):
    pass

class Preacher(Person):
    pass

有没有办法让Person的实例既是农民又是传教士?

如果这是不可能或不合理的,那么更好的解决方案就是在它们之间简单地建立一个OneToOne关系,如下所示:

class Person(models.Model):
    name = models.CharField(max_length=123)

class Farmer(models.Model):
    person = models.OneToOne(Person)

class Preacher(models.Model):
    person = models.OneToOne(Person)

1 个答案:

答案 0 :(得分:1)

继承在这里不是一个好主意。请改用OneToOne关系。 @ mattm声称它不支持多重继承是不正确的;一对一的限制是每个表,所以你确实可以让一个人在Farmer表中出现一次,一次出现在Preacher表中。

继承确实存在于数据库世界中,但至少PostgreSQL没有完美实现,并且由于Postgres总体上具有良好的标准一致性,因此对其他数据库系统来说并不是好兆头。我不建议依赖表继承,除非您已经查看了将要使用的数据库系统并确认它可以支持您的用例的每个方面。在实践中,当您只使用外键来实现相同的效果时,这种努力是不值得的。所有现代数据库系统都支持外键和唯一约束(OneToOne的构建块),并且可以正常工作。