2010-03-04 102 views
0

是否可以從其父項實例化子類模型?從父數據實例化django模型

class Object1(models.Model): 
    field1a = models.CharField() 
    field1b = models.CharField() 
    feild1c = models.ForeignKey(Object4)  

class Object2(Object1): 
    field3 = models.CharField() 

class Object3(Object1): 
    field3 = models.CharField() 

class Object4(models.Model): 
    field4 = models.CharField() 

我想要做的就是創建,然後再根據某種規則的基類實例化的一個子類,但使用已創建的基類。

喜歡的東西:

obj4 = Object4(field4='d') 
obj1 = Object1(field1a='a', field1b='b', field1c=obj4) 
if somerule: 
    obj2 = Object2(object1_ptr=obj1, field2='2') 
else: 
    obj3 = Object3(object1_ptr=obj1, field3='3') 

我不想重複Object1領域中的if/else子句。是否有可能做到這一點?當我嘗試這個時,我得到一個外鍵錯誤; 不能添加或更新子行:外鍵約束失敗

回答

0

我建議做這樣的事情:

attr = dict(field1a='a', field1b='b', field1c=obj4) 
obj1 = Object1(**attr) 
if somerule: 
    attr["field2"] = 2 
    obj2 = Object2(**attr) 
else: 
    attr["field3"]='3' 
    obj3 = Object3(**attr) 

要知道,字典attr變化的地方。

+0

謝謝。我會先給它,看看它是否做我想要的。 – 2010-03-04 06:54:40

0

你在做什麼幾乎是正確的,但如果你想複製它,你將不得不刪除主鍵。

所以...這個應該修復它:del obj2.id 但是請注意,如果其他模型引用您的模型與外部鍵,它引用obj1,而不是obj2。當然,obj1仍然存在。

+0

我沒有看到Object2(object1_ptr = obj1,可以幾乎是正確的。你想在哪裏插入一個del obj2.id? – stefanw 2010-03-04 01:46:31

+0

我假設'obj1'已經存在於數據庫中,儘管這可能是不正確的假設 在刪除/保存之前,自然會出現這種情況,雖然看到你的回答,但似乎我可能會誤解了這個問題 點仍然存在,如果對象已經存在於數據庫中,刪除主鍵讓Django重新插入它 – Wolph 2010-03-04 02:33:23

+0

感謝您的回覆我現在只是使用if/else語句來處理這個問題,並根據規則的結果創建每個對象,我只想避免重複創建對象的代碼,我的例子很小,但真實的對象有更多的fie LDS。添加/編輯保存/刪除是我以類似方式處理您的建議的另一個問題。再次感謝。 – 2010-03-04 06:53:51