South es más que capaz de hacer esta migración por usted, pero debe ser inteligente y hacerlo por etapas. Aquí está la guía paso a paso:(Esta guía presupone que usted subclase AbstractUser
, no AbstractBaseUser
)
-
Antes de hacer el cambio, asegúrese de que el soporte sur esté habilitado en la aplicación que contiene su modelo de usuario personalizado (por el bien de la guía, lo llamaremos
accounts
y el modeloUser
). Llegados a este punto, todavía no tener un modelo de usuario personalizado.$ ./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.
-
Cree una nueva migración de usuario en blanco en la aplicación de cuentas.
$ ./manage.py schemamigration accounts --empty switch_to_custom_user Created 0002_switch_to_custom_user.py.
-
Crea tu
User
personalizado modelo en lasaccounts
aplicación, pero asegúrese de que esté definida como:class SiteUser(AbstractUser): pass
-
Complete la migración en blanco con el siguiente código.
# 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
-
Ejecute la migración
$ ./manage.py migrate accounts - Migrating forwards to 0002_switch_to_custom_user. > accounts:0002_switch_to_custom_user - Loading initial data for accounts.
-
Realice cambios en su modelo de usuario ahora.
# settings.py AUTH_USER_MODEL = 'accounts.User' # accounts/models.py class SiteUser(AbstractUser): site = models.ForeignKey(Site, null=True)
-
crear y ejecutar migraciones para este cambio
$ ./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.
Honestamente, si ya tiene un buen conocimiento de su configuración y ya usa South, debería ser tan simple como agregar la siguiente migración a su módulo de cuentas.
# 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
EDITAR 5/2/13:se agregó cambio de nombre para la tabla auth_user_group. Los FK se actualizarán automáticamente para apuntar a la tabla correcta debido a las restricciones de la base de datos, pero los nombres de las tablas de los campos M2M se generan a partir de los nombres de las 2 tablas finales y necesitarán una actualización manual de esta manera.
EDICIÓN 2:Gracias a @Tuttle y @pix0r por las correcciones.