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

新手上路,请多包涵

我已经阅读了关于建立多对多关系的 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)

在文档中,据说我需要使用“关联对象”。我无法弄清楚如何正确使用它,因为它混合了声明式和映射器形式,而且示例似乎不完整。我添加了以下行:

 details = relation(ItemDetail)

作为 Item 类和行的成员:

 itemDetail = relation('Detail')

作为关联表的成员,如文档中所述。

当我执行 item = session.query(Item).first() 时,item.details 不是 Detail 对象的列表,而是 ItemDetail 对象的列表。

如何在 Item 对象中正确获取详细信息,即 item.details 应该是 Detail 对象的列表?

原文由 duduklein 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 333
1 个回答

从评论中我看到你已经找到了答案。但是对于“新用户”来说,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')

原文由 kerma 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题