2015-04-15 6 views
4

извините за мой бедный английский, моя проблема:обновление первичного ключа Джанго MySQL

Я пытаюсь обновить ПК в Django с помощью метода .save(), но когда я сохранить объект Django дублировать объект лозы тот же данных, но Differetn 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 без дублирования объекта.

Любое решение? Благодаря!

ответ

5

Я не думаю, что Django позволяет изменить первичный ключ объекта. Возможно, вам придется удалить исходный объект.

e2.delete() 

Согласно Джанго документации

поле первичного ключа только для чтения. Если вы измените значение первичного ключа на существующий объект, а затем сохраните его, новый объект будет создан вместе со старым.

Django Docs

+0

Я думаю, что удалить оригинальный объект, но странно, что django не разрешает обновление PK, спасибо! – avr

0

Сначала вы должны убедиться, что объект с основным ключом «11111111L» был добавлен в таблицу. Возможно, что-то делать по линии:

e3 = Empleados.objects.get (рк = "11111111L")

И затем, убедившись, что e3 содержит. После того, как вы убедитесь, что он есть, то вы можете просто использовать следующую инструкцию, чтобы избавиться от объекта с первичным ключом «56789034U» (если вы держите e2 вокруг):

e2.delete()

+0

И что происходит с вашими внешними ключами, указывающими на e2? По электронной почте Ой. – DylanYoung

2

метод Джанго Model.save() зависит от того, что уже есть ряд с тем же ПК в вашей БД, чтобы решить, должен ли он выдать INSERT или UPDATE запрос.

В качестве более общего правила: пока технически можно изменить PK на уровне SQL, это не обязательно такая хорошая идея, так как это означает, что вам придется обновлять все связанные строки во всех связанных таблицах (хорошо, по-прежнему технически возможно, но на самом деле это не разумная идея, насколько мне известно), И предупреждать все приложения в зависимости от этого ПК изменения тоже - и тогда удачи. Короче говоря: всегда безопаснее рассматривать ПК как непреложные (и поэтому немало людей в мире SQL предпочитают суррогатные первичные ключи, даже если есть очевидный естественный).

+1

Проблема в том, что Django пытается быть DB-агностиком и, следовательно, не поддерживает CASCADE UPDATE, что является разумным способом обновления естественного ключа. – DylanYoung

Смежные вопросы