Inheritance 烧瓶/炼金术中的遗传

Inheritance 烧瓶/炼金术中的遗传,inheritance,sqlalchemy,flask,Inheritance,Sqlalchemy,Flask,我有一个类似于下面的类结构。sqlalchemy使用db.create\u创建的表看起来都不错。在添加工作时,应填写相应的栏(教师的学校id,警察的辖区id)。我的问题出现在尝试调用do_stuff()时: 返回“hey im the parent”,这是作业的返回值。因此,尽管所有内容都正确地插入到了数据库中,但似乎实际的继承没有发生,而唯一的模型是作业模型。有没有办法解决这个问题,或者我应该用另一种方式设置它 class Job(db.Model): id = Column(Inte

我有一个类似于下面的类结构。sqlalchemy使用db.create\u创建的表看起来都不错。在添加工作时,应填写相应的栏(教师的学校id,警察的辖区id)。我的问题出现在尝试调用do_stuff()时:

返回“hey im the parent”,这是作业的返回值。因此,尽管所有内容都正确地插入到了数据库中,但似乎实际的继承没有发生,而唯一的模型是作业模型。有没有办法解决这个问题,或者我应该用另一种方式设置它

class Job(db.Model):
    id = Column(Integer, primary_key=True)
    ...

    def __init__(...):
        ...

    def do_stuff(self):
        print 'hey im the parent'

class Teacher(Job):
    school_id = Column(Integer, ForeignKey('school.id'))
    def __init__(...):
        super(Teacher, self).__init__(...)
        self.school_id = school_id

    def do_stuff(self):
        print 'teacher here'

class Policeman(Job):
    precinct_id = Column(Integer, ForeignKey'precinct.id'))
    def __init__(...):
        super(Policeman, self).__init__(...)
        self.precinct_id = precinct_id

    def do_stuff(self):
        print 'police ack'

我认为您需要使用反向引用或
db.relationship()
来指定模型之间的关系。这些答案已经提供了一些选项:

我无法复制您的问题,但也许值得研究sqlalchemy中的继承:使用您展示的代码,代码应该可以工作。请验证您的实际代码与此处的示例有多大差异。由于您的问题是任何作为“作业”响应的内容,我认为您使用了单表继承,并且缺少SQLA文档中所述的“类型”列。这些SQLA总是能找到工作,即使您可以填写表中的学校id/选区id文件。您的代码不完整,您应该使用您使用的
\uuuuu映射器\uuuu参数\uuuuuu
\uuuuuuu表名\uuuuuu
。我实际上没有填写这些。我让他们自动填写。我最终放弃了这个模型,换了一个不同的,更简单的。我失去了多态性的优点,但在可能更重要的地方获得了一些简单性。
class Job(db.Model):
    id = Column(Integer, primary_key=True)
    ...

    def __init__(...):
        ...

    def do_stuff(self):
        print 'hey im the parent'

class Teacher(Job):
    school_id = Column(Integer, ForeignKey('school.id'))
    def __init__(...):
        super(Teacher, self).__init__(...)
        self.school_id = school_id

    def do_stuff(self):
        print 'teacher here'

class Policeman(Job):
    precinct_id = Column(Integer, ForeignKey'precinct.id'))
    def __init__(...):
        super(Policeman, self).__init__(...)
        self.precinct_id = precinct_id

    def do_stuff(self):
        print 'police ack'