Je prévois de renommer plusieurs modèles dans un projet Django existant où de nombreux autres modèles ont des relations de clé étrangère avec les modèles que je souhaite renommer. Je suis assez certain que cela nécessitera plusieurs migrations, mais je ne suis pas sûr de la procédure exacte.
Disons que je commence avec les modèles suivants dans une application Django appelée 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()
Je veux renommer le Foo
modèle parce que le nom n'a pas vraiment de sens et sème la confusion dans le code, ce Bar
qui rendrait un nom beaucoup plus clair.
D'après ce que j'ai lu dans la documentation de développement Django, je suppose la stratégie de migration suivante:
Étape 1
Modifier 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()
Notez que le AnotherModel
nom du champ pour foo
ne change pas, mais la relation est mise à jour avec le Bar
modèle. Mon raisonnement est que je ne devrais pas trop changer à la fois et que si je change ce nom de champ enbar
je risquerais de perdre les données de cette colonne.
Étape 2
Créez une migration vide:
python manage.py makemigrations --empty myapp
Étape 3
Modifiez la Migration
classe dans le fichier de migration créé à l'étape 2 pour ajouter l' RenameModel
opération à la liste des opérations:
class Migration(migrations.Migration):
dependencies = [
('myapp', '0001_initial'),
]
operations = [
migrations.RenameModel('Foo', 'Bar')
]
Étape 4
Appliquez la migration:
python manage.py migrate
Étape 5
Modifiez les noms de champs associés dans 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()
Étape 6
Créez une autre migration vide:
python manage.py makemigrations --empty myapp
Étape 7
Modifiez la Migration
classe dans le fichier de migration créé à l'étape 6 pour ajouter la ou les RenameField
opérations pour tous les noms de champs associés à la liste des opérations:
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_rename_fields'), # <-- is this okay?
]
operations = [
migrations.RenameField('AnotherModel', 'foo', 'bar'),
migrations.RenameField('YetAnotherModel', 'foo', 'bar')
]
Étape 8
Appliquer la 2ème migration:
python manage.py migrate
Hormis la mise à jour du reste du code (vues, formulaires, etc.) pour refléter les nouveaux noms de variables, est-ce essentiellement ainsi que la nouvelle fonctionnalité de migration fonctionnerait?
En outre, cela semble être beaucoup d'étapes. Les opérations de migration peuvent-elles être condensées d'une manière ou d'une autre?
Merci!