2012-11-06 65 views
12

之前假設AB是Django模型,其中A有一個外鍵字段B的Django:指定外鍵的目標模型保存

a = A() 
b = B() 
a.my_b = b 
b.save() 
a.save() 

令人驚訝的amy_b外鍵字段保存null 。如果在保存之前或之後檢查a.my_b確實參考b實例,但似乎django在a.my_b = b賦值而不是a.save()上評估外鍵id本身。在複雜的系統和流程可能很難改變指令的順序,因此只需將其分配給a可能是不切實際的前節省b ...

添加不可思議聲明a.my_b=a.my_b保存命令之間的作品,但在我看來,一個可怕的解決方法。

有沒有一種方法可以配置django在保存模型實例時重新評估外鍵?

有沒有不同的方法可以解決這個問題?

回答

7

有一個描述此問題的Django票證,#8892

與此同時,沒有配置設置會改變行爲。您必須更改保存和分配操作的順序,或者執行額外的分配。

+2

當我試圖從嵌套的JSON數據動態創建模型實例時,會發生這種情況。在我的情況下,我無法在處理所有字段之前保存實例(這會導致創建相關實例),所以我無法在分配前保存。相反,我構建了一個函數列表,當實例全部連線時,這些函數將被調用。除了每個實例的保存方法之外,我還添加了一個「partial(setattr,name,value)',這樣不良分配就排隊了,直到相關實例保存完畢。可悲的是,它看起來並不像#8892會被修復,但至少他們會添加一個錯誤。 –

+0

@pluma可以擴展您的解決方案嗎?我正在處理同樣的問題。 – bryanph