sql >> Databasteknik >  >> RDS >> PostgreSQL

Migrera befintlig auth.User-data till den nya anpassade användarmodellen för Django 1.5?

South kan mer än göra den här migreringen åt dig, men du måste vara smart och göra det i etapper. Här är steg-för-steg-guiden:(Den här guiden förutsatte att du underklassade AbstractUser , inte AbstractBaseUser )

  1. Innan du gör bytet, se till att sydstöd är aktiverat i applikationen som innehåller din anpassade användarmodell (för guidens skull kallar vi det accounts och modellen User ). Vid det här laget bör du inte än har en anpassad användarmodell.

    $ ./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. Skapa en ny, tom användarmigrering i konto-appen.

    $ ./manage.py schemamigration accounts --empty switch_to_custom_user
    Created 0002_switch_to_custom_user.py.
    
  3. Skapa din anpassade User modell i accounts app, men se till att den är definierad som:

    class SiteUser(AbstractUser): pass
    
  4. Fyll i den tomma migreringen med följande kod.

    # 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. Kör migreringen

    $ ./manage.py migrate accounts
     - Migrating forwards to 0002_switch_to_custom_user.
     > accounts:0002_switch_to_custom_user
     - Loading initial data for accounts.
    
  6. Gör eventuella ändringar i din användarmodell nu.

    # settings.py
    AUTH_USER_MODEL = 'accounts.User'
    
    # accounts/models.py
    class SiteUser(AbstractUser):
        site = models.ForeignKey(Site, null=True)
    
  7. skapa och köra migreringar för denna ändring

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

Ärligt talat, om du redan har goda kunskaper om din konfiguration och redan använder syd, borde det vara så enkelt som att lägga till följande migrering till din kontomodul.

# 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:lagt till byta namn för auth_user_group-tabellen. FK:er kommer automatiskt att uppdatera för att peka på rätt tabell på grund av db-begränsningar, men M2M-fältens tabellnamn genereras från namnen på de två sluttabellerna och kommer att behöva uppdateras manuellt på detta sätt.

EDIT 2:Tack till @Tuttle &@pix0r för rättelserna.



  1. SELECT-listan finns inte i GROUP BY-satsen och innehåller icke-aggregerad kolumn .... inkompatibel med sql_mode=only_full_group_by

  2. JSON i SQL Server

  3. Favorittrick för att trimma prestanda

  4. Lokala och globala temporära tabeller i SQL Server