Django - comment renommer un champ Modèle en utilisant le Sud?
je voudrais changer un nom de champs spécifiques dans un modèle:
class Foo(models.Model):
name = models.CharField()
rel = models.ForeignKey(Bar)
doit être remplacé par:
class Foo(models.Model):
full_name = models.CharField()
odd_relation = models.ForeignKey(Bar)
Quelle est la façon la plus facile de faire cela en utilisant le Sud?
6 réponses
vous pouvez utiliser la fonction db.rename_column
.
class Migration:
def forwards(self, orm):
# Rename 'name' field to 'full_name'
db.rename_column('app_foo', 'name', 'full_name')
def backwards(self, orm):
# Rename 'full_name' field to 'name'
db.rename_column('app_foo', 'full_name', 'name')
le premier argument de db.rename_column
est le nom de la table, il est donc important de se rappeler comment Django crée des noms de table :
Django tire automatiquement le nom de la table de base de données du nom de votre classe de modèle et de l'application qui la contient. Le nom de la table de base de données d'un modèle est construit en modèle "app label" -- le nom que vous avez utilisé manage.py startapp -- au nom de classe du modèle, avec un trait de soulignement entre eux.
dans le cas où vous avez un nom de modèle en camel à plusieurs phrases, tel que ProjectItem, le nom de la table sera app_projectitem
(c.-à-d., un underscore ne sera pas inséré entre project
et item
même s'ils sont en Camel-cased).
voilà ce que je fais:
- faites le changement de nom de colonne dans votre modèle (dans cet exemple il serait
myapp/models.py
) - Exécuter
./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 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.
modifier le code dans ce fichier pour changer le comportement de migration à un simple renommé:
class Migration(SchemaMigration):
def forwards(self, orm):
# Renaming column 'mymodel.old_column_name' to 'mymodel.new_column_name'
db.rename_column(u'myapp_mymodel', 'old_column_name', 'new_column_name')
def backwards(self, orm):
# Renaming column 'mymodel.new_column_name' to 'mymodel.old_column_name'
db.rename_column(u'myapp_mymodel', 'new_column_name', 'old_column_name')
Je ne savais pas pour db.renommer la colonne, cela semble pratique, cependant dans le passé j'ai ajouté la nouvelle colonne comme un schemamigration, puis créé une datamigration pour déplacer des valeurs dans le nouveau champ, puis un second schemamigration pour supprimer l'ancienne colonne
Django 1.7 introduit Migrations donc maintenant vous n'avez même pas besoin d'installer un paquet supplémentaire pour gérer vos migrations.
pour renommer votre modèle, vous devez d'abord créer la migration vide:
$ manage.py makemigrations <app_name> --empty
alors vous devez modifier le code de votre migration comme ceci:
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('yourapp', 'XXXX_your_previous_migration'),
]
operations = [
migrations.RenameField(
model_name='Foo',
old_name='name',
new_name='full_name'
),
migrations.RenameField(
model_name='Foo',
old_name='rel',
new_name='odd_relation'
),
]
Et après cela, vous devez exécuter:
$ manage.py migrate <app_name>
il suffit de changer le modèle et exécuter makemigrations
dans 1.9
Django détecte automatiquement que vous avez supprimé et créé un seul champ, et demande:
Did you rename model.old to model.new (a IntegerField)? [y/N]
dites oui, et la bonne migration se crée. Magie.
- Ajouter
south
à vos applications installées dans le projet de création de fichier. - Commentaire de la ajouté/modifié le champ/la table.
-
$ manage.py Schemamigration <app_name> --initial
-
$ manage.py migrate <app_name> --Fake
- des nations Unies-commentaire le terrain et écrire la modification d'une seule
-
$ 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.