with tutorial para latest framework espaƱol desde cero applications python mysql django django-models primary-key

python - tutorial - latest django



Actualizar la clave primaria Django MySQL (3)

El método Model.save() Django depende de si ya hay una fila con el mismo PK en su base de datos para decidir si debe emitir una consulta INSERT o UPDATE .

Como una regla más general: si bien es técnicamente posible modificar un PK en el nivel de SQL, no es necesariamente una buena idea, ya que significa que tendrías que actualizar todas las filas relacionadas en todas las tablas relacionadas (vale, aún técnicamente es posible, pero realmente no es una idea sensata en lo que a mí respecta), Y advierta a todas las aplicaciones según este PK del cambio también, y luego buena suerte. Para resumir: siempre es más seguro considerar que los PK son inmutables (y es por eso que algunas personas en el mundo de SQL prefieren claves primarias sustitutas, incluso cuando hay una natural aparentemente obvia).

lo siento por mi pobre inglés, mi problema es:

Intento actualizar el PK en Django con el método .save () pero cuando guardo el objeto, Django duplica el objeto con los mismos datos pero difiere del PK, por ejemplo:

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>

Los objetos son iguales con PK diferente, y quiero cambiar PK sin duplicar el objeto.

¿Alguna solución? ¡Gracias!


No creo que Django te permita cambiar la clave principal del objeto. Puede que tenga que eliminar el objeto original.

e2.delete()

De acuerdo con los documentos de Django

El campo de clave principal es de solo lectura. Si cambia el valor de la clave principal en un objeto existente y luego lo guarda, se creará un nuevo objeto junto con el anterior.

Django Docs


Primero debe asegurarse de que el objeto con la clave principal "11111111L" se haya agregado a su tabla. Probablemente haciendo algo como:

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

Y luego asegurarse de que e3 contenga. Una vez que confirme que está allí, puede usar la siguiente declaración para deshacerse del objeto con la clave principal "56789034U" (suponiendo que mantenga e2):

e2.delete ()