2017-09-25 46 views
0

今天早上我遇到了一個奇怪的bug,如果有人能向我解釋爲什麼這會失敗,那就太好了。Django foreignkey在使用對象實例時未設置

讓說,我有兩個非常簡單的模型:

class MoMo(models.Model): 
    pass 


class Objo(models.Model): 
    hef_k = models.ForeignKey(MoMo, null=True, blank=True) 

當我嘗試創建其中之一然後添加一個外鍵是這樣的:

from foreing_save import models 

obj = models.Objo() 
obj.save() 
obj.hef_k = models.MoMo() 
obj.hef_k.save() 
obj.save() 

的obj.hef_k接縫存在:

obj.hef_k 
Out[9]: <MoMo: MoMo object> 

但只要我從數據庫刷新或者乾脆把它再次就不見了:

obj.refresh_from_db() 

In [12]: obj.hef_k 

In [13]: 

obj = Objo.objects.get(pk=obj.pk) 

obj.hef_k 

in [14]: 

我想念什麼嗎?它接縫奇怪,我和任何幫助,將不勝感激

+0

您需要先創建模型MoMo,因爲現在它不存在ind DB,什麼都看不到。 – Thaian

+0

您保存了外部hef_k對象,但沒有保存obj本身,所以它不保留新的修改,您需要添加obj.save() – lapinkoira

回答

0

您沒有保存obj添加相關的對象後,你只保存obj.hef_k

由於外鍵是obj上的實際字段,因此您需要保存該對象以記錄您已將其與Momo對象關聯的事實。

obj = models.Objo() 
obj.hef_k = models.MoMo() 
obj.hef_k.save() 
obj.save() 
+0

如果您嘗試此操作,您會看到它不起作用 – boblefrag

0

您需要創建第二個對象,因爲它不存在於您的數據庫中(沒有創建關係所需的PK)。所有你需要的是創造obj2之前將它們分配給obj.href_k

obj2 = models.MoMo() 
obj2.save() 

obj = models.Objo() 
obj.save() 
obj.hef_k = obj2 
obj.hef_k.save() 
+0

當然,您的方式做作品。但我想了解的是爲什麼models.fk = Obj()的方式不要 – boblefrag

+0

@boblefrag這是你的問題的答案。 ForeginKey需要對象的PK,所以你需要在DB中創建對象來獲取這個對象的PK。而你的模型對象是空的,它沒有任何PK,因爲它在模型中保存時返回。 – Thaian

0

您必須保存第二個對象之前,你可以參考它。只要它沒有保存,它就沒有主鍵。一般來說,使用<Model>.objects.create()生成新對象是個好主意。它會自動保存對象。:

from foreing_save import models 

obj = models.Objo() 
obj.save() 
obj.hef_k = models.MoMo.objects.create() 
obj.hef_k.save() 
相關問題