2013-06-12 17 views
6

Ho una struttura di classe simile al seguente. La tabella che sqlalchemy crea con db.create_all sembra buona. I lavori vengono aggiunti con le colonne appropriate compilate (school_id per insegnanti, precinct_id per poliziotti). Il mio problema nasce quando si cerca di chiamare do_stuff():Ereditarietà in pallone/SqlAlchemy

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

restituisce "hey im il genitore", che è il valore di ritorno di Giobbe. Quindi, anche se tutto è stato inserito correttamente nel DB, sembra che l'effettiva eredità non stia accadendo, ma piuttosto l'unico modello che è a posto è un modello di lavoro. C'è un modo per risolvere questo problema o devo impostarlo in un altro modo?

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

Non riesco a replicare il problema, ma forse vale la pena esaminare l'ereditarietà di sqlalchemy: http://docs.sqlalchemy.org/en/rel_0_8/orm/inheritance. html # join-table-inheritance – Teisman

+0

Usando il codice che mostri, il codice dovrebbe funzionare. Si prega di verificare quanto il tuo codice effettivo è diverso dal campione che hai inserito qui. – van

+0

Dato che il tuo problema è qualcosa che risponde come un "Lavoro", penso che tu usi l'ereditarietà a una sola tabella e manchi una colonna di "tipo" come indicato nel documento di SQLA. Quelli SQLA recuperano sempre un lavoro, anche se è possibile riempire i campi school_id/precinct_id presenti nella tabella. Il tuo codice non è completo e dovresti usare "__mapper_args__' e' __tablename__' che usi. – TonyMoutaux

risposta