2013-06-12 36 views
6

Tôi có cấu trúc lớp trông giống như dưới đây. Bảng mà sqlalchemy tạo ra với db.create_all có vẻ tốt. Công việc được thêm vào với các cột thích hợp được điền đầy đủ (school_id for Teachers, precinct_id for Policemen). Vấn đề của tôi xuất hiện khi cố gắng gọi do_stuff():Thừa kế trong Flask/SqlAlchemy

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

trả về "hey im the parent", là giá trị trả về của công việc. Vì vậy, mặc dù tất cả mọi thứ đang được đưa vào DB đúng cách, nó có vẻ như thừa kế thực tế không xảy ra mà là mô hình duy nhất được đặt ra là một mô hình công việc. Có cách nào để sửa lỗi này hay tôi nên thiết lập điều này theo cách khác?

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

Tôi không thể sao chép vấn đề của bạn, nhưng có lẽ giá trị của nó nhìn vào kế thừa trong sqlalchemy: http://docs.sqlalchemy.org/en/rel_0_8/orm/inheritance. html # join-table-inheritance – Teisman

+0

Sử dụng mã bạn hiển thị, mã sẽ hoạt động. Vui lòng xác minh số lượng mã thực tế của bạn khác với mẫu bạn đặt ở đây. – van

+0

Vì vấn đề của bạn là bất cứ điều gì đáp ứng như là một "công việc", tôi nghĩ rằng bạn sử dụng kế thừa bảng duy nhất và bạn bỏ lỡ một cột "loại" như đã nêu trong tài liệu SQLA. Các SQLA đó luôn tìm nạp một công việc, ngay cả khi bạn có thể điền đầy đủ các tệp tin school_id/precinct_id có trong bảng. Mã của bạn chưa hoàn thành và bạn nên sử dụng '__mapper_args__' và' __tablename__'. – TonyMoutaux

Trả lời

0

Tôi tin rằng bạn cần phải xác định mối quan hệ giữa các mô hình bằng cách sử dụng back-tham khảo hoặc db.relationship(). Những câu trả lời này đã cung cấp một vài tùy chọn: backref & db.relationshipforeign key relationships