PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Migration des données auth.User existantes vers le nouveau modèle utilisateur personnalisé de Django 1.5 ?

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 )

  1. 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èle User ).À 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.
    
  2. 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.
    
  3. Créez votre User personnalisé modèle dans les accounts app, mais assurez-vous qu'elle est définie comme :

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