我已经阅读了关于构建多对多关系的SQLAlchemy文档和教程,但是当关联表包含多于2个外键时,我无法弄清楚如何正确地完成它。
我有一个项目表,每个项目都有很多细节。许多项目的细节可以相同,因此项目和细节之间存在多对多的关系
我有以下内容:
class Item(Base):
__tablename__ = 'Item'
id = Column(Integer, primary_key=True)
name = Column(String(255))
description = Column(Text)
class Detail(Base):
__tablename__ = 'Detail'
id = Column(Integer, primary_key=True)
name = Column(String)
value = Column(String)
我的关联表是(它在代码中的其他2之前定义):
class ItemDetail(Base):
__tablename__ = 'ItemDetail'
id = Column(Integer, primary_key=True)
itemId = Column(Integer, ForeignKey('Item.id'))
detailId = Column(Integer, ForeignKey('Detail.id'))
endDate = Column(Date)
在文档中,据说我需要使用“关联对象”。我无法弄清楚如何正确使用它,因为它与mapper表单混合声明,并且示例似乎不完整。我添加了一行:
details = relation(ItemDetail)
作为Item类的成员和行:
itemDetail = relation('Detail')
作为关联表的成员,如文档中所述。
当我执行item = session.query(Item).first()时,item.details不是Detail对象的列表,而是ItemDetail对象的列表。
如何在Item对象中正确获取详细信息,即item.details应该是Detail对象的列表?
答案 0 :(得分:13)
从评论中我看到你找到了答案。但SQLAlchemy文档对于“新用户”而言非常压倒性,而我正在努力解决同样的问题。所以供将来参考:
ItemDetail = Table('ItemDetail',
Column('id', Integer, primary_key=True),
Column('itemId', Integer, ForeignKey('Item.id')),
Column('detailId', Integer, ForeignKey('Detail.id')),
Column('endDate', Date))
class Item(Base):
__tablename__ = 'Item'
id = Column(Integer, primary_key=True)
name = Column(String(255))
description = Column(Text)
details = relationship('Detail', secondary=ItemDetail, backref='Item')
class Detail(Base):
__tablename__ = 'Detail'
id = Column(Integer, primary_key=True)
name = Column(String)
value = Column(String)
items = relationship('Item', secondary=ItemDetail, backref='Detail')