sql >> Database >  >> RDS >> PostgreSQL

Bestaande auth.User-gegevens migreren naar het nieuwe aangepaste gebruikersmodel van Django 1.5?

South is meer dan in staat om deze migratie voor je te doen, maar je moet slim zijn en het in fasen doen. Hier is de stap-voor-stap handleiding:(Deze handleiding veronderstelde dat je subklasse AbstractUser , niet AbstractBaseUser )

  1. Voordat u overstapt, moet u ervoor zorgen dat South-ondersteuning is ingeschakeld in de toepassing die uw aangepaste gebruikersmodel bevat (voor de handleiding noemen we het accounts en het model User ).Op dit punt moet u nog niet een aangepast gebruikersmodel hebben.

    $ ./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. Maak een nieuwe, lege gebruikersmigratie aan in de account-app.

    $ ./manage.py schemamigration accounts --empty switch_to_custom_user
    Created 0002_switch_to_custom_user.py.
    
  3. Maak uw aangepaste User model in de accounts app, maar zorg ervoor dat deze is gedefinieerd als:

    class SiteUser(AbstractUser): pass
    
  4. Vul de lege migratie in met de volgende code.

    # 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. Voer de migratie uit

    $ ./manage.py migrate accounts
     - Migrating forwards to 0002_switch_to_custom_user.
     > accounts:0002_switch_to_custom_user
     - Loading initial data for accounts.
    
  6. Breng nu wijzigingen aan in uw gebruikersmodel.

    # settings.py
    AUTH_USER_MODEL = 'accounts.User'
    
    # accounts/models.py
    class SiteUser(AbstractUser):
        site = models.ForeignKey(Site, null=True)
    
  7. migraties maken en uitvoeren voor deze wijziging

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

Eerlijk gezegd, als je al een goede kennis hebt van je setup en al South gebruikt, zou het zo simpel moeten zijn als het toevoegen van de volgende migratie aan je accountmodule.

# 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 2/5/13:hernoemen toegevoegd voor auth_user_group tabel. FK's worden automatisch bijgewerkt om naar de juiste tabel te wijzen vanwege db-beperkingen, maar de tabelnamen van M2M-velden worden gegenereerd op basis van de namen van de 2 eindtabellen en moeten op deze manier handmatig worden bijgewerkt.

EDIT 2:Met dank aan @Tuttle &@pix0r voor de correcties.



  1. Hoe werkt MySQL CASE?

  2. Hoe op te lossen toegang geweigerd voor gebruiker 'root'@'localhost' (met wachtwoord:Ja) bij verbinding maken met MySQL-database

  3. Wat is het verschil tussen het 'yy'- en 'rr'-datummasker van orakel?

  4. Het belang van een goed databaseontwerp (en 7 stappen om dit te bereiken)