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 Foomodèle parce que le nom n'a pas vraiment de sens et sème la confusion dans le code, ce Barqui 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 AnotherModelnom du champ pour foone change pas, mais la relation est mise à jour avec le Barmodè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 Migrationclasse dans le fichier de migration créé à l'étape 2 pour ajouter l' RenameModelopé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 Migrationclasse dans le fichier de migration créé à l'étape 6 pour ajouter la ou les RenameFieldopé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!