2010-08-13 65 views
2

我試圖在SQLAlchemy中創建一個「產品」對象,到目前爲止,我已經得到了所有工作,接受了產品的「附件」。我所擁有的是一個帶有一個字段/值對列表的產品(即容量:12升等),以及整數ID和目錄號。我希望能夠將某些「附件」與給定產品相關聯,其中這些附件是也是產品。基本上我只想要一個關聯表,它具有product_id和accessory_id,它們都引用Products表中的ID。這是我到目前爲止有:SQLAlchemy,自引用輔助表關聯

product_accessories=Table('product_accesssories',Base.metadata,\ 
        Column('product_id',Integer,ForeignKey('product.product_id')),\ 
        Column('accessory_id',Integer,ForeignKey('product.product_id'))) 

class Product(Base): 
    __tablename__='product' 
    id=Column('product_id',Integer,primary_key=True) 
    catNo=Column('catalog_number',String(20)) 
    fields=relationship('ProductField') 
    accessories=relationship('Product',secondary=product_accessories) 

我得到錯誤「無法確定加入的父/子表之間的條件對關係Product.accessories」。我已經嘗試過繞過一堆,並且一直無法到達任何地方。我不想失去對產品的獨特參考,我覺得應該有一種更簡單的方法來做到這一點,而不是將配件包裝到另一個類中。

任何幫助將不勝感激!

回答

1
import sqlalchemy as sa 
from sqlalchemy import orm 

products_table = sa.Table('products', metadata, 
    sa.Column('id', sa.Integer(), primary_key=True), 
    sa.Column('catalog_number', sa.String(20)), 
) 

accessories_table = sa.Table('product_accessories', metadata, 
    sa.Column('product_id', sa.ForeignKey(products_table.c.id), primary_key=True), 
    sa.Column('accessory_id', sa.ForeignKey(products_table.c.id), primary_key=True), 
) 

class Product(object): 
    pass 

class Accessory(object): 
    pass 

orm.mapper(Product, products_table, properties=dict(
    accessories=orm.relation(Accessory, 
     primaryjoin=(products_table.c.id == accessories_table.c.product_id), 
     secondaryjoin=(products_table.c.id == accessories_table.c.accessory_id), 
    ), 
)) 
orm.mapper(Accessory, accessories_table)