South è più che in grado di eseguire questa migrazione per te, ma devi essere intelligente e farlo per gradi. Ecco la guida passo passo:(Questa guida presupponeva la sottoclasse AbstractUser , non AbstractBaseUser )
-
Prima di effettuare il passaggio, assicurati che il supporto sud sia abilitato nell'applicazione che contiene il tuo modello utente personalizzato (per motivi di guida, lo chiameremo
accountse il modelloUser).A questo punto dovresti non ancora avere un modello utente personalizzato.$ ./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. -
Crea una nuova migrazione utente vuota nell'app degli account.
$ ./manage.py schemamigration accounts --empty switch_to_custom_user Created 0002_switch_to_custom_user.py. -
Crea il tuo
Userpersonalizzato modello neiaccountsapp, ma assicurati che sia definito come:class SiteUser(AbstractUser): pass -
Completa la migrazione vuota con il seguente codice.
# 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 -
Esegui la migrazione
$ ./manage.py migrate accounts - Migrating forwards to 0002_switch_to_custom_user. > accounts:0002_switch_to_custom_user - Loading initial data for accounts. -
Apporta subito le modifiche al tuo modello utente.
# settings.py AUTH_USER_MODEL = 'accounts.User' # accounts/models.py class SiteUser(AbstractUser): site = models.ForeignKey(Site, null=True) -
crea ed esegui migrazioni per questa modifica
$ ./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.
Onestamente, se hai già una buona conoscenza della tua configurazione e usi già south, dovrebbe essere semplice come aggiungere la seguente migrazione al modulo dei tuoi account.
# 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 2/5/13:aggiunta la ridenominazione per la tabella auth_user_group. Gli FK si aggiorneranno automaticamente per puntare alla tabella corretta a causa di vincoli db, ma i nomi delle tabelle dei campi M2M vengono generati dai nomi delle 2 tabelle finali e dovranno essere aggiornati manualmente in questo modo.
EDIT 2:Grazie a @Tuttle e @pix0r per le correzioni.