sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Migrar los datos existentes de auth.User al nuevo modelo de usuario personalizado de Django 1.5?

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 )

  1. 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 modelo User ). 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.
    
  2. 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.
    
  3. Crea tu User personalizado modelo en las accounts aplicación, pero asegúrese de que esté definida como:

    class SiteUser(AbstractUser): pass
    
  4. 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
    
  5. 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.
    
  6. 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)
    
  7. 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.