Python sqlalchemy多态多对多
我希望通过以下方式获得属于父类的对象列表:Python sqlalchemy多态多对多,python,sqlalchemy,many-to-many,polymorphism,Python,Sqlalchemy,Many To Many,Polymorphism,我希望通过以下方式获得属于父类的对象列表: class A(object): __tablename__ = 'a' id = Column(Integer, primary_key=True) collection = relationship(.....) # contains an ordered list of [B, C, B, B, C, C, C, B, C, C, ...]; class B(object): __tablename__ = 'b
class A(object):
__tablename__ = 'a'
id = Column(Integer, primary_key=True)
collection = relationship(.....) # contains an ordered list of [B, C, B, B, C, C, C, B, C, C, ...];
class B(object):
__tablename__ = 'b'
id = Column(Integer, primary_key=True)
class C(object):
__tablename__ = 'c'
id = Column(Integer, primary_key=True)
SQLAlchemy examples文件夹有一个简单的多对一文件夹,在我的示例中,类B和C是a的“父”类(而不是相反),但我无法解决如何将其转换为一对多,然后添加一个双向关系,使其成为多对多
有人能帮我解决这个问题吗?这有点痛苦,
AbstractConcreteBase
显然需要再润色一下,但它是这样的:
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base, AbstractConcreteBase
Base = declarative_base()
class A(Base):
__tablename__ = 'a'
id = Column(Integer, primary_key=True)
class BC(AbstractConcreteBase, Base):
pass
class B(BC):
__tablename__ = 'b'
id = Column(Integer, primary_key=True)
a_id = Column(Integer, ForeignKey('a.id'))
__mapper_args__ = {
"polymorphic_identity": "b",
"concrete": True
}
class C(BC):
__tablename__ = 'c'
id = Column(Integer, primary_key=True)
a_id = Column(Integer, ForeignKey('a.id'))
__mapper_args__ = {
"polymorphic_identity": "c",
"concrete": True
}
configure_mappers()
A.collection = relationship(BC, primaryjoin=BC.a_id == A.id)
engine = create_engine("sqlite://", echo=True)
Base.metadata.create_all(engine)
sess = Session(engine)
sess.add_all([
A(collection=[
B(),
C(),
C()
]),
A(collection=[
B(),
B()
])
])
sess.commit()
for a in sess.query(A):
for bc in a.collection:
print a, bc
它们(
B类
和C类
)是否相同?不,它们是具有不同字段的不同类。那么A类
和B类
之间以及A类
和C类
之间的关系是什么?就抽象对象而言,它们代表不同的事物;目前有A和B有多对多(A和C也是如此),但我相信如果我能想出如何创建有序列表集合
,这是无关紧要的。真糟糕,这比我想到的要干净得多——最终我的解决方案使用了类BC(Base):\uuu映射器\u参数\uuuuuuuu={'polymorphic_on':类型,'polymorphic_identity':'bc','with_polymorphic':'*'}
然后B和C都被迫有一个bc\u id
列。嘿@zzzeek,我想知道在如何实现这一点上是否有任何改进。PS:我喜欢你的工作!特别是SQLAlchemy和Alembic。另外,我想知道如果a和bc处于多对多关系中,这会是什么样子。