【问题标题】:Sqlalchemy many to many mapping with extra fields带有额外字段的 Sqlalchemy 多对多映射
【发布时间】:2011-12-05 23:35:42
【问题描述】:

我用 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()

而且效果很好。但我真正想要的是存储多个具有相同 group 值的主题,所以我尝试了以下测试:

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 完成吗?

提前致谢

【问题讨论】:

  • 我认为您拥有的模型在数据库级别上表现得很好。但是按照您的意愿使用的简单方法......我不确定开箱即用的解决方案,但您可以尝试实现自己的自定义集合(请参阅sqlalchemy.org/docs/orm/…

标签: python orm sqlalchemy pyramid


【解决方案1】:

拉齐

我认为你正在构建错误的关系。

你的关系必须是

预订 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 的文档。但是每次我发现每个键只与一个对象相关联,而不是一个。如果您在任何地方阅读,请提供链接,以便我检查它是否适合您的代码。

我想这会对你有所帮助。

【讨论】:

    猜你喜欢
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 2016-06-18
    相关资源
    最近更新 更多