2013-02-20 101 views
2

我想通過使用SQLAlchemy的雙向多對多關係關聯兩個數據庫對象。我需要該關聯存在於聯結表中。表和數據存在於SQLite3數據庫中。在SQLAlchemy中以多對多關係關聯對象

下面是一個簡單的例子。

Base = declarative_base() 

class Colour (Base): 
    __tablename__ = 'colours' 
    id = Column("id", Integer, primary_key=True) 
    name = Column("name", String) 
    vehicles = association_proxy('vehicles_and_colours', 'vehicles') 

class Vehicle (Base): 
    __tablename__ = 'vehicles' 
    id = Column("id", Integer, primary_key=True) 
    name = Column("name", String) 
    colours = association_proxy('vehicles_and_colours', 'colours') 

class ColourVehicle (Base): 
    __tablename__ = 'vehicles_and_colours' 
    colour_id = Column('colour_fk', Integer, ForeignKey('colours.id'), primary_key=True) 
    vehicle_id = Column('vehicle_fk', Integer, ForeignKey('vehicles.id'), primary_key=True) 

    colours = relationship(Colour, backref=backref("vehicles_and_colours")) 
    vehicles = relationship(Vehicle, backref=backref("vehicles_and_colours")) 

blue = session.query(Colour).filter(Colour.name == "blue").first() 
car = session.query(Vehicle).filter(Vehicle.name == "car").first() 

blue.vehicles.append(car) 

這給我的錯誤:

File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.0b2-py2.6-linux-i686.egg/sqlalchemy/ext/associationproxy.py", line 554, in append 
    item = self._create(value) 
    File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.8.0b2-py2.6-linux-i686.egg/sqlalchemy/ext/associationproxy.py", line 481, in _create 
    return self.creator(value) 
TypeError: __init__() takes exactly 1 argument (2 given) 

我在做什麼錯?

回答

2

關聯代理要求要麼目標對象具有單個參數的構造,這將創建相應的中介物,或者creator指定其建立了如何創建ColorVehicle:

vehicles = association_proxy('vehicles_and_colours', 'vehicles', 
       creator=lambda vehicle: ColorVehicle(vehicle=vehicle)) 

colours = association_proxy('vehicles_and_colours', 'colours', 
       creator=lambda color: ColorVehicle(color=color)) 

這是完全記錄at:

http://docs.sqlalchemy.org/en/rel_0_8/orm/extensions/associationproxy.html#creation-of-new-values

相關問題