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可以做到这一点吗?
提前谢谢你!
1 个回答
6
Razi
我觉得你建立的关系有点问题。
你的关系应该是:
书籍和主题之间是多对多的关系
主题和小组之间也是多对多的关系
所以你需要再创建一个模型来表示小组,并且在主题模型中把它设置为 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 的文档。但是每次我发现每个键只关联一个对象,而不是多个。如果你在其他地方看到过相关信息,请分享链接,这样我可以看看它是如何适应你的代码的。
我觉得这会对你有帮助。