PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Migrando dados de auth.User existentes para o novo modelo de usuário personalizado do Django 1.5?


A South é mais do que capaz de fazer essa migração para você, mas você precisa ser esperto e fazê-lo em etapas. Aqui está o guia passo a passo:(Este guia pressupõe que você subclasse AbstractUser , não AbstractBaseUser )

  1. Antes de fazer a troca, certifique-se de que o suporte ao sul esteja habilitado no aplicativo que contém seu modelo de usuário personalizado (para fins do guia, chamaremos de accounts e o modelo User ). Neste ponto, você deve ainda não tem um modelo de usuário 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. Crie uma nova migração de usuário em branco no aplicativo de contas.
    $ ./manage.py schemamigration accounts --empty switch_to_custom_user
    Created 0002_switch_to_custom_user.py.
    

  3. Crie seu User personalizado model nas accounts app, mas certifique-se de que esteja definido como:
    class SiteUser(AbstractUser): pass
    

  4. Preencha a migração em branco com o código a seguir.
    # 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. Execute a migração
    $ ./manage.py migrate accounts
     - Migrating forwards to 0002_switch_to_custom_user.
     > accounts:0002_switch_to_custom_user
     - Loading initial data for accounts.
    

  6. Faça qualquer alteração no seu modelo de usuário agora.
    # settings.py
    AUTH_USER_MODEL = 'accounts.User'
    
    # accounts/models.py
    class SiteUser(AbstractUser):
        site = models.ForeignKey(Site, null=True)
    

  7. crie e execute migrações para esta mudança
    $ ./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, se você já tem um bom conhecimento de sua configuração e já usa o sul, deve ser tão simples quanto adicionar a seguinte migração ao seu módulo de contas.
# 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:adicionada renomeação para a tabela auth_user_group. Os FKs serão atualizados automaticamente para apontar para a tabela correta devido a restrições de banco de dados, mas os nomes das tabelas dos campos M2M são gerados a partir dos nomes das 2 tabelas finais e precisarão de atualização manual dessa maneira.

EDIT 2:Obrigado a @Tuttle e @pix0r pelas correções.