Sqlalchemy定义了相同模式(和backref)之间的多个OnetoOne关系

2024-05-15 22:47:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我好像在这里绕不过去。以下是我目前正在处理的问题

class Node(Base):

    __tablename__ = 'nodes'

    id = Column(Integer, primary_key=true)

    prev_change = relationship("NodeChange", back_populates="new_node", uselist=False)
    next_change = relationship("NodeChange", back_populates="old_node", uselist=False)

Class NodeChange(Base):

    __tablename__ = "node_changes"
    id = Column(Integer, primary_key=true)
    date = Column(Date)

    old_node_id = Column(Integer, ForeignKey('nodes.id'))
    old_node = relationship("Node", foreign_keys=[old_node_id])

    new_node_id = Column(Integer, ForeignKey('nodes.id'))
    new_node = relationship("Node", foreign_keys=[new_node_id])

其背后的思想是通过存储时间相关信息的节点更改对象(更改是否可行等)遍历节点对象

这两种关系都是一对一的。我在排除了prev_changenext_changebackref的情况下实现了这一点,但如果不遇到AmbigiousForeignKeyError,则无法实现双向关系


Tags: keyidnodenewbasecolumnintegerchange
1条回答
网友
1楼 · 发布于 2024-05-15 22:47:13

解决此问题的最简单方法是:

  1. Node中删除prev_changenext_change关系
  2. 将它们作为backref添加到old_nodenew_node

这就是新关系的样子:

old_node = relationship(
    "Node", foreign_keys=[old_node_id],
    backref=backref('prev_change', uselist=False),
)

new_node = relationship(
    "Node", foreign_keys=[new_node_id],
    backref=backref('next_change', uselist=False),
)

相关问题 更多 >