Django - Comment faire pour renommer un modèle de champ à l'aide d'Sud?
J'aimerais changer pour un nom de champs spécifiques dans un modèle:
class Foo(models.Model):
name = models.CharField()
rel = models.ForeignKey(Bar)
devrait changer:
class Foo(models.Model):
full_name = models.CharField()
odd_relation = models.ForeignKey(Bar)
Quelle est la meilleure façon de le faire à l'aide du Sud?
- Voir aussi stackoverflow.com/questions/2862979/... pour renommer un modèle plutôt qu'un champ de modèle.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
db.rename_column
fonction.Le premier argument de
db.rename_column
est le nom de la table, de sorte qu'il est important de se rappeler comment Django crée des noms de table:Dans le cas où vous avez un multi-rédigé, en camelcase le nom du modèle, tels que ProjectItem, le nom de la table sera
app_projectitem
(c'est à dire, un trait de soulignement ne sera pas inséré entreproject
etitem
même si elles sont en camelcase).DataMigration
, et de renommer la colonne de là.Voici ce que je fais:
myapp/models.py
)./manage.py schemamigration myapp renaming_column_x --auto
Note
renaming_column_x
peut être tout ce que vous voulez, c'est juste une façon de donner un nom descriptif pour le fichier de migration.Cela va générer un fichier appelé
myapp/migrations/000x_renaming_column_x.py
qui permet de supprimer votre ancienne colonne et ajouter une nouvelle colonne.Modifier le code dans ce fichier pour modifier le comportement de migration pour un simple changement de nom:
x
oucolumn_x
?--auto
migration premier est une bonne astuce. Il évite les problèmes avec le Sud de l'ORM Congélateur, qui se produisent si la migration a seulementforwards
etbackwards
méthodes, mais ne contient pas les surgelésmodel
objet.db.rename_column
ne renommez pas le contraintes associé à la colonne. La migration aura encore du travail, mais vous aurez des contraintes nommé d'après l'ancien nom de la colonne. J'avais une colonne avec une contrainte d'unicité, de les renommer à l'aide de cette méthode, testée que la contrainte d'unicité toujours existé et il a eu une erreur, mais le nom de la contrainte elle-même était encore en utilisant l'ancien nom de la colonne. Peut-être explicitedb.delete_unique
etdb.create_unique
l'aurait fait, mais j'ai décidé d'aller avec sjh de la solution.Je ne savais pas à propos de db.renommer la colonne, les sons à portée de main, cependant, dans le passé, j'ai ajouté une nouvelle colonne comme un schemamigration, puis créé un datamigration de déplacer les valeurs dans le champ nouveau, puis une deuxième schemamigration pour supprimer l'ancienne colonne
Django 1.7 introduit Les Migrations alors maintenant, vous n'avez même pas besoin d'installer un paquet supplémentaire pour gérer les migrations.
Changer le nom de votre modèle, vous devez créer vide migration première:
Ensuite, vous devez modifier votre migration de code comme ceci:
Et après cela, vous devez exécuter:
Il suffit de changer le modèle et exécution de
makemigrations
dans 1,9Django détecte automatiquement que vous avez supprimé et créé un champ unique, et demande:
Dire oui, et le droit de la migration est créé. De la magie.
south
à vos applications installées dans le projet de création de fichier.$ manage.py Schemamigration <app_name> --initial
$ manage.py migrate <app_name> --Fake
$ manage.py Schemamigration --auto
$ manage.py migrate <app_name>
Si vous utilisez le 'pycharm', alors vous pouvez utiliser "ctrl+maj+r" au lieu de "manage.py' et 'shift' pour les paramètres.