Về cơ bản, tôi có mô hình này, nơi tôi ánh xạ trong một bảng duy nhất là lớp "BaseNode" và hai lớp con. Vấn đề là tôi cần một trong các lớp con, để có mối quan hệ một-nhiều với lớp con khác. Vì vậy, trong sắp xếp, nó là một mối quan hệ với một hàng của lớp khác nhau (phân lớp), nhưng trong cùng một bảng. Làm thế nào để bạn nghĩ rằng tôi có thể viết nó bằng cách sử dụng cú pháp khai báo ?.SQLAlchemy Mối quan hệ một-nhiều đối với thừa kế bảng đơn - khai báo
Lưu ý: Do các mối quan hệ khác trong mô hình của tôi, nếu có thể, tôi thực sự cần phải gắn bó với kế thừa bảng đơn.
class BaseNode(DBBase):
__tablename__ = 'base_node'
id = Column(Integer, primary_key=True)
discriminator = Column('type', String(50))
__mapper_args__ = {'polymorphic_on': discriminator}
class NodeTypeA(BaseNode):
__mapper_args__ = {'polymorphic_identity': 'NodeTypeA'}
typeB_children = relationship('NodeTypeB', backref='parent_node')
class NodeTypeB(BaseNode):
__mapper_args__ = {'polymorphic_identity': 'NodeTypeB'}
parent_id = Column(Integer, ForeignKey('base_node.id'))
Sử dụng mã này sẽ ném:
sqlalchemy.exc.ArgumentError: NodeTypeA.typeB_children and back-reference NodeTypeB.parent_node are both of the same direction . Did you mean to set remote_side on the many-to-one side ?
Bất kỳ ý tưởng hoặc đề nghị?
Cảm ơn bạn đã trả lời nhanh chóng !. Tôi đã thử, nhưng tôi vẫn gặp lỗi tương tự. Tôi nên thay đổi lớp NodeTypeB như thế nào ?. Trong mã của bạn, bạn xác định Employee.manager_id và Employee.manager bên ngoài định nghĩa lớp. Nhưng trong đề xuất của bạn cho mã của tôi, bạn đã không. Xin lỗi tôi nghĩ rằng tôi không hiểu rõ. Trân trọng. –
Các tài liệu SQLAlchemy nói rằng nó là OK để cung cấp các chuỗi mà có được eval'd để bạn có thể nhận được xung quanh lỗi cú pháp tự tham khảo. Nhưng tôi chưa bao giờ thử nó. – wberry
Trong NodeTypeB, khóa ngoại của bạn là asset_base. Tôi đoán đó là lỗi đánh máy hoặc bạn quên thay đổi tên trước khi đăng. Tôi nghĩ rằng nếu bạn thay đổi ForeignKey ('asset_base.id') sang ForeignKey (NodeTypeA.id) thì nó sẽ gần với ví dụ làm việc của tôi. – wberry