1 回答

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個(gè)贊
這不是強(qiáng)制性的;您不需要同時(shí)填充兩者。將外鍵設(shè)置為相關(guān)實(shí)例可能是一個(gè)等待自身出現(xiàn)的錯(cuò)誤。你唯一需要做的就是
child = Child()
parent = Parent(child=child)
在這之后parent.child_id是None,但它們代表ORM的對(duì)象部分就好了。parent.child是對(duì)創(chuàng)建的引用child。除了它們的 Python 對(duì)象 ID 之外,它們還沒(méi)有被持久化到數(shù)據(jù)庫(kù)并且沒(méi)有身份。只有當(dāng)您將它們添加到 aSession并將更改刷新到數(shù)據(jù)庫(kù)時(shí),它們才會(huì)收到身份,因?yàn)樗鼈兪褂蒙傻拇礞I。這是從對(duì)象世界到關(guān)系世界的映射發(fā)生的地方。SQLAlchemy 會(huì)自動(dòng)填寫(xiě)parent.child_id,以便他們的關(guān)系也記錄在數(shù)據(jù)庫(kù)中(注意這不是關(guān)系模型中的“關(guān)系”的意思)。
回到示例,添加一些打印有助于跟蹤發(fā)生的情況和時(shí)間:
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
您也可以顛倒這種情況:您可能擁有現(xiàn)有Child對(duì)象的 ID ,但沒(méi)有實(shí)際對(duì)象的 ID 。在這種情況下,您可以簡(jiǎn)單地分配給child_id自己。
所以,回答標(biāo)題:您不需要 ORMrelationship來(lái)?yè)碛?DB 外鍵關(guān)系,但您可以使用它來(lái)將 DB 關(guān)系映射到對(duì)象世界。
添加回答
舉報(bào)