Para cambiar la clave principal con el sur se puede utilizar el comando south.db.create_primary_key en datamigration. Para cambiar su pk CharField personalizada con la norma AutoField que debe hacer:
1) crear un nuevo campo en el modelo
class MyModel(Model):
id = models.AutoField(null=True)
1,1) si tiene una clave externa en algún otro modelo de este modelo, cree nuevo campo falso fk en estos modelo demasiado (utilizar IntegerField, que luego se convertirá)
class MyRelatedModel(Model):
fake_fk = models.IntegerField(null=True)
2) crear la migración sur automática y migrar:
./manage.py schemamigration --auto
./manage.py migrate
3) crear una nueva datamigration
./manage.py datamigration <your_appname> fill_id
en datamigration tis llenar estos nuevos Identificación y campos fk con los números (solo enumerarlos)
for n, obj in enumerate(orm.MyModel.objects.all()):
obj.id = n
# update objects with foreign keys
obj.myrelatedmodel_set.all().update(fake_fk = n)
obj.save()
db.delete_primary_key('my_app_mymodel')
db.create_primary_key('my_app_mymodel', ['id'])
4) en su conjunto modelos primary_key = True en su nuevo campo pk
id = models.AutoField(primary_key=True)
5) eliminar el campo de la clave primaria anterior (si no es necesario) crear auto migra y migrar.
5.1) si tiene las claves externas - Eliminar viejos campos de clave externa también (migrar)
6) último paso - restablecer las relaciones clave fireign. Crear campo FK real otra vez, y eliminar su campo fake_fk, crear la migración automática pero no migran - tiene que modificar la migración ha creado automáticamente (!): En lugar de crear nuevos FK y eliminar fake_fk - cambiar el nombre de la columna fake_fk
# in your models
class MyRelatedModel(Model):
# delete fake_fk
# fake_fk = models.InegerField(null=True)
# create real fk
mymodel = models.FoeignKey('MyModel', null=True)
# in migration
def forwards(self, orm):
# left this without change - create fk field
db.add_column('my_app_myrelatedmodel', 'mymodel',
self.gf('django.db.models.fields.related.ForeignKey')(default=1, related_name='lots', to=orm['my_app.MyModel']),keep_default=False)
# remove fk column and rename fake_fk
db.delete_column('my_app_myrelatedmodel', 'mymodel_id')
db.rename_column('my_app_myrelatedmodel', 'fake_fk', 'mymodel_id')
por lo tanto, fake_fk previamente llenado se convierte en una columna, que contiene datos de relaciones reales, y no se pierde después de todos los pasos anteriores.
¿Nos puede mostrar su modelo? –
@tomlog: vea http://stackoverflow.com/questions/2011629/unicode-error-when-saving-an-object-in-django-admin Hay un ejemplo. Deseo agregar una identificación como pk – luc
FWIW, no hay nada de malo en tener el nombre de una clave principal, siempre y cuando la base de datos use correctamente los índices. – Tobu