Estoy planeando cambiar el nombre de varios modelos en un proyecto Django existente donde hay muchos otros modelos que tienen relaciones de clave externa con los modelos que me gustaría cambiar el nombre. Estoy bastante seguro de que esto requerirá múltiples migraciones, pero no estoy seguro del procedimiento exacto.
Digamos que empiezo con los siguientes modelos dentro de una aplicación Django llamada myapp
:
class Foo(models.Model):
name = models.CharField(unique=True, max_length=32)
description = models.TextField(null=True, blank=True)
class AnotherModel(models.Model):
foo = models.ForeignKey(Foo)
is_awesome = models.BooleanField()
class YetAnotherModel(models.Model):
foo = models.ForeignKey(Foo)
is_ridonkulous = models.BooleanField()
Quiero cambiar el nombre del Foo
modelo porque el nombre realmente no tiene sentido y está causando confusión en el código, y Bar
sería un nombre mucho más claro.
Por lo que he leído en la documentación de desarrollo de Django, estoy asumiendo la siguiente estrategia de migración:
Paso 1
Modificar models.py
:
class Bar(models.Model): # <-- changed model name
name = models.CharField(unique=True, max_length=32)
description = models.TextField(null=True, blank=True)
class AnotherModel(models.Model):
foo = models.ForeignKey(Bar) # <-- changed relation, but not field name
is_awesome = models.BooleanField()
class YetAnotherModel(models.Model):
foo = models.ForeignKey(Bar) # <-- changed relation, but not field name
is_ridonkulous = models.BooleanField()
Tenga en cuenta que el AnotherModel
nombre del campo foo
no cambia, pero la relación se actualiza con el Bar
modelo. Mi razonamiento es que no debería cambiar demasiado de una vez y que si cambiara este nombre de campo bar
correría el riesgo de perder los datos en esa columna.
Paso 2
Crea una migración vacía:
python manage.py makemigrations --empty myapp
Paso 3
Edite la Migration
clase en el archivo de migración creado en el paso 2 para agregar la RenameModel
operación a la lista de operaciones:
class Migration(migrations.Migration):
dependencies = [
('myapp', '0001_initial'),
]
operations = [
migrations.RenameModel('Foo', 'Bar')
]
Paso 4
Aplicar la migración:
python manage.py migrate
Paso 5
Edite los nombres de campo relacionados en models.py
:
class Bar(models.Model):
name = models.CharField(unique=True, max_length=32)
description = models.TextField(null=True, blank=True)
class AnotherModel(models.Model):
bar = models.ForeignKey(Bar) # <-- changed field name
is_awesome = models.BooleanField()
class YetAnotherModel(models.Model):
bar = models.ForeignKey(Bar) # <-- changed field name
is_ridonkulous = models.BooleanField()
Paso 6
Crea otra migración vacía:
python manage.py makemigrations --empty myapp
Paso 7
Edite la Migration
clase en el archivo de migración creado en el paso 6 para agregar las RenameField
operaciones para cualquier nombre de campo relacionado a la lista de operaciones:
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_rename_fields'), # <-- is this okay?
]
operations = [
migrations.RenameField('AnotherModel', 'foo', 'bar'),
migrations.RenameField('YetAnotherModel', 'foo', 'bar')
]
Paso 8
Aplicar la 2da migración:
python manage.py migrate
Además de actualizar el resto del código (vistas, formularios, etc.) para reflejar los nuevos nombres de variables, ¿es así básicamente cómo funcionaría la nueva funcionalidad de migración?
Además, esto parece muchos pasos. ¿Se pueden condensar las operaciones de migración de alguna manera?
¡Gracias!