2013-06-12 15 views
6

Mam strukturę klasową, która wygląda podobnie do poniższej. Tabela, którą sqlalchemy tworzy za pomocą db.create_all, wygląda dobrze. Zadania są dodawane z odpowiednimi wypełnionymi kolumnami (school_id for Teachers, posterunek dla Policeman). Mój problem pojawia się podczas próby wywołania do_stuff():Dziedziczenie w kolbie/SqlAlchemy

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

zwraca "hej im rodzic", który jest wartością zwracaną przez Job. Tak więc, mimo że wszystko jest wstawiane do DB poprawnie, wydaje się, że rzeczywiste dziedziczenie nie występuje, ale raczej jedynym Modelem, który jest na miejscu, jest model Pracy. Czy istnieje sposób, aby to naprawić, czy powinienem ustawić to w inny sposób?

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

Nie mogłem odtworzyć twojego problemu, ale być może warto zajrzeć do dziedziczenia w sqlalchemy: http://docs.sqlalchemy.org/en/rel_0_8/orm/inheritance. html # join-table-dziedziczenie – Teisman

+0

Używając pokazanego kodu, kod powinien zadziałać. Sprawdź, ile rzeczywisty kod różni się od próbki, którą tu wstawiłeś. – van

+0

Jako że twoim problemem jest cokolwiek odpowiadającego jako "Praca", myślę, że używasz dziedziczenia z pojedynczej tabeli i tęsknisz za kolumną "typ", jak podano w dokumencie SQLA. Te SQLA zawsze pobierają zadanie, nawet jeśli możesz wypełnić wpisy school_id/precinct_id, które są obecne w tabeli. Twój kod nie jest kompletny i powinieneś użyć '__mapper_args__' i' __tablename__', których używasz. – TonyMoutaux

Odpowiedz