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?

205
demandé sur Serjik 2010-07-13 13:53:02

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).

227
répondu googletorp 2015-12-09 10:48:00

voilà ce que je fais:

  1. faites le changement de nom de colonne dans votre modèle (dans cet exemple il serait myapp/models.py )
  2. 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')
38
répondu donturner 2014-04-02 21:29:52

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

15
répondu sjh 2010-07-13 16:49:30

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>
8
répondu Dmitrii Mikhailov 2015-03-24 08:29:21

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.

5
  1. Ajouter south à vos applications installées dans le projet de création de fichier.
  2. Commentaire de la ajouté/modifié le champ/la table.
  3. $ manage.py Schemamigration <app_name> --initial
  4. $ manage.py migrate <app_name> --Fake
  5. des nations Unies-commentaire le terrain et écrire la modification d'une seule
  6. $ manage.py Schemamigration --auto
  7. $ 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.

0
répondu ancho 2014-09-04 12:56:55