2013-06-12 78 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

回答