更新主键 Django MySQL

Update primary key Django MySQL

我尝试使用 .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。

有解决办法吗?谢谢!

首先你应该确保主键为“11111111L”的对象已经添加到你的table。可能会按照以下方式做一些事情:

e3 = Empleados.objects.get(pk="11111111L")

然后确保 e3 包含 .一旦你确认它在那里,那么你就可以使用下面的语句来删除主键为“56789034U”的对象(假设你保留了 e2):

e2.delete()

我认为 Django 不允许您更改对象的主键。您可能必须删除原始对象。

e2.delete()

根据 Django 文档

The primary key field is read-only. If you change the value of the primary key on an existing object and then save it, a new object will be created alongside the old one.

Django Docs

Django 的 Model.save() 方法依赖于您的数据库中是否已经有具有相同 PK 的行来决定是否应该发出 INSERTUPDATE 查询。

作为更一般的规则:虽然 技术上 可以在 SQL 级别修改 PK,但这不一定是个好主意,因为这意味着你必须更新所有相关表中的所有相关行(好吧,技术上仍然可行,但就我而言确实不是一个理智的想法),并警告所有依赖于此 PK 的应用程序更改 - 然后祝你好运.长话短说:将 PK 视为不可变的总是更安全(这就是为什么 SQL 世界中有相当多的人喜欢代理主键,即使有一个看似明显的自然主键)。