208 votes

Django - Comment renommer un champ de modèle en utilisant South ?

Je souhaite modifier le nom de certains champs d'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)

Quel est le moyen le plus simple d'y parvenir en utilisant South ?

230voto

googletorp Points 22395

Vous pouvez utiliser le db.rename_column fonction.

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 souvenir de la façon dont Django crée des noms de tables :

Django dérive automatiquement le nom de la table de la base de données à partir 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 joignant le "label de l'application" du modèle -- le nom que vous avez utilisé dans manage.py startapp -- au nom de la classe du modèle, avec un trait de soulignement entre les deux.

Dans le cas d'un nom de modèle à plusieurs mots et à majuscules, tel que ProjectItem, le nom de la table sera le suivant app_projectitem (c'est-à-dire qu'un trait de soulignement ne sera pas inséré entre les mots project y item même s'il s'agit de chameaux).

39voto

donturner Points 3552

Voici ce que je fais :

  1. Modifiez le nom de la colonne dans votre modèle (dans cet exemple, il s'agirait de myapp/models.py )
  2. Exécuter ./manage.py schemamigration myapp renaming_column_x --auto

Note renaming_column_x peut être ce que vous voulez, c'est juste une façon de donner un nom descriptif au fichier de migration.

Vous obtiendrez ainsi un fichier appelé myapp/migrations/000x_renaming_column_x.py qui supprimera votre ancienne colonne et en ajoutera une nouvelle.

Modifier le code dans ce fichier pour changer le comportement de la migration en un simple renommage :

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

15voto

sjh Points 1316

Je ne connaissais pas db.rename column, ça a l'air pratique, mais dans le passé j'ai ajouté la nouvelle colonne dans une schemamigration, puis j'ai créé une datamigration pour déplacer les valeurs dans le nouveau champ, puis une deuxième schemamigration pour supprimer l'ancienne colonne.

12voto

Dmitrii Mikhailov Points 2467

Introduction de Django 1.7 Migrations Vous n'avez donc plus besoin d'installer un paquetage supplémentaire pour gérer vos migrations.

Pour renommer votre modèle, vous devez d'abord créer une migration vide :

$ manage.py makemigrations <app_name> --empty

Ensuite, vous devez modifier le code de votre migration comme suit :

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'
    ),
]

Ensuite, il faut courir :

$ manage.py migrate <app_name>

5voto

Ciro Santilli Points 3341

Il suffit de modifier le modèle et d'exécuter makemigrations en 1.9

Django détecte automatiquement que vous avez supprimé et créé un seul champ, et vous le demande :

Did you rename model.old to model.new (a IntegerField)? [y/N]

Dire oui, c'est créer la bonne migration. Magique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X