2013-06-12 15 views
6

Aşağıdakine benzeyen bir sınıf yapısına sahibim. Sqlchemy'nin db.create_all ile yarattığı tablo iyi görünüyor. İşler, doldurulmuş uygun sütunlarla eklenir (Öğretmenler için school_id, Policemen için precinct_id).) (Do_stuff çağırmak çalışırken Sorunum gelir:Flask/SqlAlchemy'de Kalıtım

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

döner Job dönüş değeridir, "Hey ebeveyn im". Bu yüzden her şey DB'ye düzgün bir şekilde yerleştirilse de, gerçek mirasın gerçekleşmediği, aksine yegâne Model'in bir İş modeli olduğu görülüyor. Bunu düzeltmenin bir yolu var mı yoksa bunu başka şekilde mi ayarlamalıyım?

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

Sorununu çoğaltmak olamazdı, ama sqlalchemy Devralmayla içine bakarak belki de değer: http://docs.sqlalchemy.org/en/rel_0_8/orm/inheritance. html # joined-table-devralma – Teisman

+0

Gösterdiğiniz kodu kullanarak, kod çalışmalıdır. Lütfen gerçek kodunuzun, buraya koyduğunuz örnekten ne kadar farklı olduğunu doğrulayın. – van

+0

Sorununuz bir "İş" olarak yanıt veren bir şey olduğundan, tek bir tablo devralma kullandığınızı düşünüyorum ve SQLA doc'da belirtildiği gibi bir "tür" sütunu kaçırırsınız. Masaüstünde bulunan school_id/precinct_id dosyalarını doldurabilseniz bile, bu SQLA her zaman bir İş getirecektir. Kodunuz tamamlanmadı ve kullandığınız '__mapper_args__' ve' __tablename__' olmalıdır. – TonyMoutaux

cevap