更新主键Django-MySQL

2024-05-12 18:37:37 发布

您现在位置:Python中文网/ 问答频道 /正文

对不起,我英语不好,我的问题是:

我试图用.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>

不同的主键对象是相同的,我想改变主键而不复制对象。

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


Tags: 数据对象django方法fromgetobjectssave
3条回答

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

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

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

e2.delete()

根据Django docs

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

首先,应该确保主键为“1111111L”的对象已添加到表中。可能做了如下事情:

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

然后确保e3包含。一旦您确认它在那里,那么您就可以使用下面的语句去掉主键为“56789034U”的对象(假设您保持e2在附近):

e2.delete()

相关问题 更多 >