2013-06-12 10 views
6

私は以下のようなクラス構造を持っています。 sqlalchemyがdb.create_allを使用して作成した表は良好に見えます。ジョブは、適切な欄に記入して追加されます(教師用のスクールID、警察官用のプレシンクトID)。私の問題は、do_stuff()を呼び出すときに発生します。Flask/SqlAlchemyの継承

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

は、ジョブの戻り値である "hey im the parent"を返します。したがって、すべてがDBに正しく挿入されているにもかかわらず、実際の継承は発生していないようですが、代わりに唯一のモデルが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のドキュメントに記載されているように "タイプ"の列がないと思う。これらのSQLAは、表に存在するschool_id/precinct_idファイルをフルフィルできる場合でも、常にジョブをフェッチします。 あなたのコードは完全ではなく、 '__mapper_args__'と' __tablename__'を使うべきです。 – TonyMoutaux

答えて

0

私はあなたが戻って、参照またはdb.relationship()を使用して、モデル間の関係を指定する必要があります信じています。これらの回答には、いくつかのオプションが用意されています。backref & db.relationshipforeign key relationships