PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Vorhandene auth.User-Daten zum neuen benutzerdefinierten Django 1.5-Benutzermodell migrieren?

South ist mehr als in der Lage, diese Migration für Sie durchzuführen, aber Sie müssen schlau sein und es in Etappen tun. Hier ist die Schritt-für-Schritt-Anleitung:(Diese Anleitung setzt voraus, dass Sie AbstractUser ableiten , nicht AbstractBaseUser )

  1. Stellen Sie vor dem Wechsel sicher, dass die South-Unterstützung in der Anwendung aktiviert ist, die Ihr benutzerdefiniertes Benutzermodell enthält (der Anleitung halber nennen wir es accounts). und das Modell User ).An dieser Stelle sollten Sie noch nicht ein benutzerdefiniertes Benutzermodell haben.

    $ ./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. Erstellen Sie eine neue, leere Benutzermigration in der Konten-App.

    $ ./manage.py schemamigration accounts --empty switch_to_custom_user
    Created 0002_switch_to_custom_user.py.
    
  3. Erstellen Sie Ihren benutzerdefinierten User Modell in den accounts app, aber stellen Sie sicher, dass sie wie folgt definiert ist:

    class SiteUser(AbstractUser): pass
    
  4. Füllen Sie die leere Migration mit dem folgenden Code aus.

    # 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. Führen Sie die Migration aus

    $ ./manage.py migrate accounts
     - Migrating forwards to 0002_switch_to_custom_user.
     > accounts:0002_switch_to_custom_user
     - Loading initial data for accounts.
    
  6. Nehmen Sie jetzt alle Änderungen an Ihrem Benutzermodell vor.

    # settings.py
    AUTH_USER_MODEL = 'accounts.User'
    
    # accounts/models.py
    class SiteUser(AbstractUser):
        site = models.ForeignKey(Site, null=True)
    
  7. Migrationen für diese Änderung erstellen und ausführen

    $ ./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.
    

Ehrlich gesagt, wenn Sie sich bereits gut mit Ihrem Setup auskennen und South bereits verwenden, sollte es so einfach sein, die folgende Migration zu Ihrem Kontomodul hinzuzufügen.

# 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

BEARBEITEN 05.02.13:Umbenennung für die Tabelle auth_user_group hinzugefügt. FKs werden aufgrund von DB-Einschränkungen automatisch aktualisiert, um auf die richtige Tabelle zu verweisen, aber die Tabellennamen von M2M-Feldern werden aus den Namen der beiden Endtabellen generiert und müssen auf diese Weise manuell aktualisiert werden.

EDIT 2:Danke an @Tuttle &@pix0r für die Korrekturen.