2013-06-12 79 views
6

我有一个类似于下面的类结构。 sqlalchemy用db.create_all创建的表看起来不错。作业添加了填写的适当栏(教师的school_id,警察的precinct_id)。我试图调用do_stuff()时出现问题:继承Flask/SqlAlchemy

p = Teacher(...) 
p.do_stuff() 

返回“hey im the parent”,这是Job的返回值。所以,即使所有东西都被正确地插入数据库,看起来好像没有发生实际的继承,但是唯一的就是Job模型。有没有办法解决这个问题,或者我应该以另一种方式进行设置?

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' 
+0

我无法复制您的问题,但可能它的值得关注sqlalchemy中的继承:http://docs.sqlalchemy.org/en/rel_0_8/orm/inheritance。 html#joined-table-inheritance – Teisman

+0

使用你显示的代码,代码应该工作。请确认您的实际代码与您在此放置的样本有多大差异。 – van

+0

由于你的问题是作为“作业”响应的任何事情,我认为你使用单表继承,你错过了SQLA文档中所述的“类型”列。即使您可以填写表中存在的school_id/precinct_id文件,那些SQLA也会始终读取作业。 你的代码不完整,你应该使用'__mapper_args__'和'__tablename__'。 – TonyMoutaux

回答