2011-10-12 47 views
2

我創建了許多與SQLAlchemy的許多關係是這樣的:SQLAlchemy的多對多映射使用額外字段

subject_books = Table('subject_books', Base.metadata, 
    Column('subject_id', Integer, ForeignKey('subjects.id')), 
    Column('book_id', Integer, ForeignKey('books.id')), 
    Column('group', Integer) 
) 

class Subject(Base): 
    __tablename__ = 'subjects' 
    id = Column(Integer, primary_key=True) 
    value = Column(Unicode(255), unique=True) 

class Book(Base): 
    __tablename__ = 'books' 
    id = Column(Integer, primary_key=True) 
    title = Column(Unicode(255)) 
    isbn = Column(Unicode(24)) 
    subjects = relationship('Subject', secondary=subject_books, collection_class=attribute_mapped_collection('group'), backref='books') 

之後,我創建了一個測試類似以下內容:

book = Book(title='first book',isbn='test') 
book.subjects[0] = Subject(value='first subject') 
book.subjects[1] = Subject(value='second subject') 

session.add(book) 
transaction.commit() 

,它工作正常。但我真正想要的是存儲與同值超過一個主題,所以我嘗試了以下測試:

book = Book(title='first book',isbn='test') 
book.subjects[0] = [Subject(value='first subject'),Subject(value='second subject')] 
book.subjects[1] = [Subject(value='third subject'),Subject(value='forth subject')] 

session.add(book) 
transaction.commit() 

,但它不工作。

這可以使用sqlalchemy完成嗎?

由於提前

+0

我認爲你所擁有的模型在數據庫層面表現良好。但是,按照您的意願使用簡單的方法......我不確定現成的解決方案,但您可以嘗試實施自己的自定義集合(請參閱http://www.sqlalchemy.org/docs /orm/collections.html?highlight=attribute_mapped_collection#custom-collection-implementations) – van

回答

4

拉齊

我認爲你是錯的建設關係的船。

你的關係,船舶必須

書M2M主題

主題M2M組

所以,你必須創建一個組一個多模式,必須在標題被指定爲m2m

您的模型將會像。

subject_books = Table('subject_books', Base.metadata, 
    Column('subject_id', Integer, ForeignKey('subjects.id')), 
    Column('book_id', Integer, ForeignKey('books.id')),   
) 
subject_group = Table('subject_groups', Base.metadata, 
    Column('group_id', Integer, ForeignKey('groups.id')), 
    Column('subject_id', Integer, ForeignKey('subjects.id')), 
) 

class Subject(Base): 
    __tablename__ = 'subjects' 
    id = Column(Integer, primary_key=True) 
    value = Column(Unicode(255), unique=True) 
    groups = relationship('Groups', secondary=subject_groups, backref='subjects') 

class Groups(Base): 
    __tablename__ = 'groups' 
    id = Column(Integer, primary_key=True) 
    name = Column(Unicode(255), unique=True) 

class Book(Base): 
    __tablename__ = 'books' 
    id = Column(Integer, primary_key=True) 
    title = Column(Unicode(255)) 
    isbn = Column(Unicode(24)) 
    subjects = relationship('Subject', secondary=subject_books, backref='books') 

我還檢查了attribute_mapped_collection的文檔。但每次我發現每個鍵只與一個對象關聯,而不是一個關聯。如果你在任何地方閱讀,請提供鏈接,以便檢查它是如何適合你的代碼的。

我認爲這會對你有所幫助。

相關問題