2012-03-05 4 views
3

Je dois renommer une clé étrangère dans mon modèle django en utilisant les migrations sud. J'ai pensé que j'avais de la chance quand j'ai trouvé ce fil How to rename a foreignkey field with South? Cependant, toutes les méthodes décrites là échouent, avec diverses erreurs. Est-ce que quelqu'un sait réellement la bonne manière de faire ceci?Comment renommer une clé étrangère dans django-south, dans le bon sens

Je veux renommer SomeModel.registered_to = models.ForeignKey(User) à SomeModel.owner = models.ForeignKey(User) et maintenir la relation entre User et owner Toute aide serait appréciée!

Répondre

3

Modifiez le nom du champ et exécutez python manage.py schemamigration --auto yourapp. South ajoutera du code pour déposer la colonne et en ajouter une nouvelle. Laisser South générer la migration assure que l'ORM est gelé correctement, donc tout ce que vous devez faire est de simplement changer la migration en renommer au lieu de drop et ajouter. Il suffit de supprimer ces lignes de l'avant et en arrière migration vers et les remplacer par:

def forwards(self, orm): 
    db.rename_column('yourapp_yourmodel', 'registered_to_id', 'owner_id') 

def backwards(self, orm): 
    db.rename_column('yourapp_yourmodel', 'owner_id', 'registered_to_id') 

Enregistrer, puis migrer votre application.

+0

Cette technique a été mentionnée dans le thread I ci-dessus, et je l'ai essayée. Il semble fonctionner, ne jette aucune exception. Mais après avoir terminé toute tentative d'accès 'SomeModel.owner' soulèvera' DoesNotExist' –

+3

Dans Postgres, cela semble fonctionner pour changer le nom de la clé étrangère. Le nom de la contrainte reste le même si ... est-ce important? – Nils

Questions connexes