1 回答

TA贡献1775条经验 获得超11个赞
这不是强制性的;您不需要同时填充两者。将外键设置为相关实例可能是一个等待自身出现的错误。你唯一需要做的就是
child = Child()
parent = Parent(child=child)
在这之后parent.child_id是None,但它们代表ORM的对象部分就好了。parent.child是对创建的引用child。除了它们的 Python 对象 ID 之外,它们还没有被持久化到数据库并且没有身份。只有当您将它们添加到 aSession并将更改刷新到数据库时,它们才会收到身份,因为它们使用生成的代理键。这是从对象世界到关系世界的映射发生的地方。SQLAlchemy 会自动填写parent.child_id,以便他们的关系也记录在数据库中(注意这不是关系模型中的“关系”的意思)。
回到示例,添加一些打印有助于跟踪发生的情况和时间:
child = Child()
parent = Parent(child=child)
print(parent.child_id) # None
session.add(parent)
session.flush() # Send changes held in session to DB
print(parent.child_id) # The ID assigned to child
您也可以颠倒这种情况:您可能拥有现有Child对象的 ID ,但没有实际对象的 ID 。在这种情况下,您可以简单地分配给child_id自己。
所以,回答标题:您不需要 ORMrelationship来拥有 DB 外键关系,但您可以使用它来将 DB 关系映射到对象世界。
添加回答
举报