South est plus que capable de faire cette migration pour vous, mais vous devez être intelligent et le faire par étapes. Voici le guide étape par étape :(Ce guide supposait que vous sous-classiez AbstractUser
, pas AbstractBaseUser
)
-
Avant d'effectuer le changement, assurez-vous que la prise en charge de south est activée dans l'application qui contient votre modèle d'utilisateur personnalisé (pour les besoins du guide, nous l'appellerons
accounts
et le modèleUser
).À ce stade, vous ne devriez pas encore avoir un modèle d'utilisateur personnalisé.$ ./manage.py schemamigration accounts --initial Creating migrations directory at 'accounts/migrations'... Creating __init__.py in 'accounts/migrations'... Created 0001_initial.py. $ ./manage.py migrate accounts [--fake if you've already syncdb'd this app] Running migrations for accounts: - Migrating forwards to 0001_initial. > accounts:0001_initial - Loading initial data for accounts.
-
Créez une nouvelle migration d'utilisateur vide dans l'application Comptes.
$ ./manage.py schemamigration accounts --empty switch_to_custom_user Created 0002_switch_to_custom_user.py.
-
Créez votre
User
personnalisé modèle dans lesaccounts
app, mais assurez-vous qu'elle est définie comme :class SiteUser(AbstractUser): pass
-
Remplissez la migration vide avec le code suivant.
# encoding: utf-8 from south.db import db from south.v2 import SchemaMigration class Migration(SchemaMigration): def forwards(self, orm): # Fill in the destination name with the table name of your model db.rename_table('auth_user', 'accounts_user') db.rename_table('auth_user_groups', 'accounts_user_groups') db.rename_table('auth_user_user_permissions', 'accounts_user_user_permissions') def backwards(self, orm): db.rename_table('accounts_user', 'auth_user') db.rename_table('accounts_user_groups', 'auth_user_groups') db.rename_table('accounts_user_user_permissions', 'auth_user_user_permissions') models = { ....... } # Leave this alone
-
Exécutez la migration
$ ./manage.py migrate accounts - Migrating forwards to 0002_switch_to_custom_user. > accounts:0002_switch_to_custom_user - Loading initial data for accounts.
-
Apportez des modifications à votre modèle utilisateur maintenant.
# settings.py AUTH_USER_MODEL = 'accounts.User' # accounts/models.py class SiteUser(AbstractUser): site = models.ForeignKey(Site, null=True)
-
créer et exécuter des migrations pour ce changement
$ ./manage.py schemamigration accounts --auto + Added field site on accounts.User Created 0003_auto__add_field_user_site.py. $ ./manage.py migrate accounts - Migrating forwards to 0003_auto__add_field_user_site. > accounts:0003_auto__add_field_user_site - Loading initial data for accounts.
Honnêtement, si vous avez déjà une bonne connaissance de votre configuration et que vous utilisez déjà sud, cela devrait être aussi simple que d'ajouter la migration suivante à votre module de comptes.
# encoding: utf-8
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Fill in the destination name with the table name of your model
db.rename_table('auth_user', 'accounts_user')
db.rename_table('auth_user_groups', 'accounts_user_groups')
db.rename_table('auth_user_permissions', 'accounts_user_permissions')
# == YOUR CUSTOM COLUMNS ==
db.add_column('accounts_user', 'site_id',
models.ForeignKey(orm['sites.Site'], null=True, blank=False)))
def backwards(self, orm):
db.rename_table('accounts_user', 'auth_user')
db.rename_table('accounts_user_groups', 'auth_user_groups')
db.rename_table('accounts_user_user_permissions', 'auth_user_user_permissions')
# == YOUR CUSTOM COLUMNS ==
db.remove_column('accounts_user', 'site_id')
models = { ....... } # Leave this alone
EDIT 05/02/13 :ajout d'un nouveau nom pour la table auth_user_group. Les FK seront automatiquement mis à jour pour pointer vers la table correcte en raison des contraintes de base de données, mais les noms de table des champs M2M sont générés à partir des noms des 2 tables de fin et nécessiteront une mise à jour manuelle de cette manière.
EDIT 2 :Merci à @Tuttle &@pix0r pour les corrections.