SQLAlchemy自引用多对多关系中back_populates无法自动更新反向关联
多对多关系中back_populates无法自动更新反向集合的问题
我正在开发一个精简词典API,目前在数据库层遇到了问题。
我的数据库模型定义如下(可按需排除字段):
translations = Table( "translations", Base.metadata, Column("left_id", ForeignKey("words.id"), primary_key=True), Column("right_id", ForeignKey("words.id"), primary_key=True), ) class Word(Base): __tablename__ = "words" id: Mapped[int] = mapped_column(primary_key=True) value: Mapped[str] = mapped_column(String(24)) translation: Mapped[Set["Word"]] = relationship( secondary=translations, primaryjoin=id == translations.c.left_id, secondaryjoin=id == translations.c.right_id, lazy="joined", back_populates="translation", )
我的问题是back_populates没有提供自动更新的功能。执行以下代码后:
""" 假设session已创建 """ w1 = Word(value="bonjour") w2 = Word(value="hello") s.add_all([w1, w2]) w1.translation.add(w2) await s.commit()
w2.translation仍然是空集合。
补充说明
是的,该字段名为translation,但这是多对多关系。我现在需要实现一种可以将多个单词关联在一起的方法。手动处理反向引用会让逻辑变得过于复杂,所以这不是一个好方案,比如我写的这个link函数:
def link(session, *args): for idx, word in enumerate(args[:-1]): word.translation.add(*[arg for arg in args if arg != word]) # word.translation.add(*args[:idx], *[idx+1:]) session.commit()
内容的提问来源于stack exchange,提问作者Inbasu
相关产品推荐
相关产品推荐

