如何使用SQLAlchemy构建多对多关系:一个很好的例子

时间:2011-04-22 14:42:30

标签: python many-to-many sqlalchemy associations

我已经阅读了关于构建多对多关系的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对象的列表?

1 个答案:

答案 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')