python - Sqlalchemy many to many mapping with extra fields -
i created many many relationship sqlalchemy this:
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')
after created test following:
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()
and works fine. want store more 1 subject same group value, tried following test:
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()
but not work.
can done using sqlalchemy?
thanks in advance
razi
i think constructing wrong relation ship.
your relation ship must be
book m2m subject
subject m2m group
so have create 1 more model group , must assign m2m
in subject
your models like.
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')
i check docs attribute_mapped_collection. each time found each key associated 1 object not more one. if read anywhere please provide link can check how fit in code.
i think you.
Comments
Post a Comment