2011-04-22 124 views
10

我已經閱讀了關於構建多對多關係的SQLAlchemy文檔和教程,但我無法弄清楚如何在關聯表包含多於2個外鍵。如何使用SQLAlchemy建立多對多關係:一個很好的例子

我有一個項目表,每個項目都有很多細節。詳細信息可以在許多項目一樣,所以項目及

之間的許多一對多的關係,我有以下幾點:

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對象的列表?

+2

http://www.sqlalchemy.org/docs/orm/extensions/associationproxy.html是非常詳細和大量的例子。不知道這裏還需要什麼。 – 2011-04-22 14:54:18

+1

關聯代理不是我正在尋找的。我用Table 1替換了ItemDetial類聲明,並在關係函數 – duduklein 2011-04-22 20:40:29

回答

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') 
+0

中使用了第二個參數不知道爲什麼,但在我的情況下,我不得不在BaseDatabase表中添加'Base.metadata',如[here](http ://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#many-to-many)。 – n1000 2015-02-13 14:36:11

+1

@Kerma我有另一個問題。如何把關係放在同一個類中而不是放在Item類和Detail類中分開? – tyan 2016-05-13 07:31:22

相關問題