繁体   English   中英

更新主键 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。

有什么解决办法吗? 谢谢!

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

e2.delete()

根据 Django 文档

主键字段是只读的。 如果您在现有对象上更改主键的值然后保存它,则会在旧对象旁边创建一个新对象。

Django 文档

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

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

首先,您应该确保主键为“11111111L”的对象已添加到您的表中。 可能会做一些类似的事情:

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

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

e2.delete()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM