Je voudrais changer le nom de champs spécifiques dans un modèle:
class Foo(models.Model):
name = models.CharField()
rel = models.ForeignKey(Bar)
devrait changer en:
class Foo(models.Model):
full_name = models.CharField()
odd_relation = models.ForeignKey(Bar)
Quelle est la façon la plus simple de le faire en utilisant South?
python
django
django-models
django-south
Jonathan
la source
la source
Réponses:
Vous pouvez utiliser la
db.rename_column
fonction.Le premier argument de
db.rename_column
est le nom de la table, il est donc important de se rappeler comment Django crée les noms de table :Dans le cas où vous avez un nom de modèle à plusieurs mots et à boîtier chameau, tel que ProjectItem, le nom de la table sera
app_projectitem
(c'est-à-dire qu'un trait de soulignement ne sera pas inséré entreproject
etitem
même s'ils sont à boîtier chameau).la source
Voici ce que je fais:
myapp/models.py
)./manage.py schemamigration myapp renaming_column_x --auto
La note
renaming_column_x
peut être tout ce que vous aimez, c'est juste un moyen de donner un nom descriptif au fichier de migration.Cela vous générera un fichier appelé
myapp/migrations/000x_renaming_column_x.py
qui supprimera votre ancienne colonne et ajoutera une nouvelle colonne.Modifiez le code de ce fichier pour changer le comportement de migration en un simple renommage:
la source
x
oucolumn_x
?--auto
migration en premier est un excellent conseil. Cela évite les problèmes avec le congélateur ORM Sud, qui se produisent si la migration ne comporteforwards
que desbackwards
méthodes et ne contient pas l'model
objet figé .db.rename_column
ne renomme pas les contraintes associées à la colonne. La migration fonctionnera toujours mais vous aurez des contraintes nommées d'après l'ancien nom de colonne. J'ai eu une colonne avec une contrainte d'unicité, je l'ai renommée à l'aide de cette méthode, j'ai testé que la contrainte d'unicité existait toujours et j'ai eu une erreur mais le nom de la contrainte lui-même utilisait toujours l'ancien nom de colonne. Peut-être une explicitedb.delete_unique
et l'db.create_unique
aurait fait mais j'ai décidé d'aller avec la solution de sjh.Je ne connaissais pas la colonne db.rename, cela semble pratique, mais dans le passé, j'ai ajouté la nouvelle colonne comme une schémamigration, puis créé une migration de données pour déplacer les valeurs dans le nouveau champ, puis une deuxième schémamigration pour supprimer l'ancienne colonne
la source
db.rename_column
ne renommera pas les contraintes pour vous, vous devez donc gérer cela manuellement. Si vous oubliez de le faire, la migration fonctionnera sauf que, à votre insu, il peut y avoir une contrainte utilisant toujours l'ancien nom de colonne. Il n'est pas clair pour moi si le problème est purement cosmétique ou si dans une future migration où la contrainte devrait être manipulée ou abandonnée au Sud ne pourra pas la trouver. En tout cas, le faire ici comme le suggère sjh est le moyen le plus sûr de le faire: vous pouvez laisser South comprendre ce qu'il devrait comprendre.Django 1.7 a introduit les migrations , vous n'avez donc plus besoin d'installer de package supplémentaire pour gérer vos migrations.
Pour renommer votre modèle, vous devez d'abord créer une migration vide:
Ensuite, vous devez modifier le code de votre migration comme ceci:
Et après cela, vous devez exécuter:
la source
Il suffit de changer de modèle et de lancer la version
makemigrations
1.9Django détecte automatiquement que vous avez supprimé et créé un seul champ et demande:
Dites oui et la bonne migration est créée. La magie.
la source
south
à vos applications installées dans le fichier de paramètres du projet.$ manage.py Schemamigration <app_name> --initial
$ manage.py migrate <app_name> --Fake
$ manage.py Schemamigration --auto
$ manage.py migrate <app_name>
Si vous utilisez 'pycharm', vous pouvez utiliser 'ctrl + shift + r' au lieu de 'manage.py' et 'shift' pour les paramètres.
la source