2015-04-15 55 views
4

對不起我的英語不好,我的問題是:更新主鍵的Django的MySQL

我嘗試更新的Django與方法.save)的PK(但是當我保存對象Django的複製對象枝條一樣數據但differetn PK,例如:

from gestion_empleados.Models import Empleados 
>>> e = Empleados.objects.get(pk="56789034U") 
>>> e.pk 
u'56789034U' 
>>> e.pk = "11111111L" 
>>> e.save() 
>>> e.pk 
'11111111L' 
>>> e2 = Empleados.objects.get(pk="56789034U") 
>>> e2 
<Empleados: Juan 56789034U> 
>>> e 
<Empleados: Juan 11111111L> 

的對象是不同的PK相同,並且我想改變PK而不復制的對象。

任何解決方案?謝謝!

回答

5

我不認爲Django的可以讓你改變對象的主鍵。您可能需要刪除原始對象。

e2.delete() 

根據Django文檔

主鍵字段是隻讀的。如果您更改現有對象上主鍵的值並保存它,則會在舊對象旁邊創建一個新對象。

Django Docs

+0

我想刪除原始對象,但奇怪django不允許更新PK,謝謝! – avr

0

首先,您應該確保主鍵「11111111L」的對象已添加到您的表中。可能做一些線沿線的:

E3 = Empleados.objects.get(PK = 「11111111L」)

然後確保E3包含。一旦你確認它的存在,那麼你可以用下面的語句,以擺脫與主鍵「56789034U」的對象(假設你保持周圍E2):

e2.delete ()

+0

你的外鍵指向e2會發生什麼?糟糕! – DylanYoung

2

Django的Model.save()方法依賴於是否有已經在你的數據庫相同的PK,以決定是否應該發出INSERTUPDATE查詢一行。

作爲更一般的規則:雖然它在技術上是可能在SQL級別修改PK,但它不一定是個好主意,因爲這意味着您必須更新所有相關表中的所有相關行好吧,儘管技術上可行,但就我而言,這確實不是一個理智的想法),並根據變化的PK也警告所有應用程序 - 然後祝你好運。長話短說:將PK看作是不可變的,這總是比較安全的(這就是爲什麼SQL世界中有相當一部分人傾向於使用代理主鍵的原因,即使存在一個看似明顯的自然鍵)。

+1

這裏的問題是,Django試圖成爲DB不可知的,因此不支持CASCADE UPDATE,這是更新自然鍵的理智方式。 – DylanYoung