我尝试使用方法.save()更新Django中的PK但是当我保存对象时,Django使用相同的数据复制对象但是不同的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而不重复对象。
任何解决方案?谢谢!
答案 0 :(得分:8)
我认为Django不允许您更改对象的主键。您可能必须删除原始对象。
e2.delete()
根据Django docs
主键字段是只读的。如果更改现有对象上主键的值然后保存它,则将创建一个与旧对象并列的新对象。
答案 1 :(得分:3)
Django的Model.save()
方法取决于您的数据库中是否已经有一行具有相同的PK,以决定是否应该发出INSERT
或UPDATE
查询。
作为一个更一般的规则:虽然它在技术上可以在SQL级别修改PK,但它并不一定是个好主意,因为它意味着你&# 39; d必须更新所有相关表格中的所有相关行(好的,技术上仍然可能,但就我而言真的不是一个理智的想法),并警告所有应用程序依赖于此变化的PK - 并且祝你好运。总而言之:将PK视为不可变的总是更安全(这就是为什么SQL世界中很多人都喜欢代理主键,即使在看似明显的自然主键时也是如此)。
答案 2 :(得分:0)
首先,您应该确保具有主键的对象&#34; 11111111L&#34;已添加到您的表中。可能做的事情如下:
e3 = Empleados.objects.get(pk =&#34; 11111111L&#34;)
然后确保e3包含。一旦你确认它在那里,那么你可以使用以下语句来摆脱主键&#34; 56789034U&#34; (假设你保持e2左右):
e2.delete()