PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Migracja istniejących danych auth.User do nowego niestandardowego modelu użytkownika Django 1.5?

Południe jest w stanie wykonać tę migrację za Ciebie, ale musisz być sprytny i robić to etapami. Oto przewodnik krok po kroku:(W tym przewodniku zakłada się podklasę AbstractUser , a nie AbstractBaseUser )

  1. Przed dokonaniem przełączenia upewnij się, że obsługa South jest włączona w aplikacji, która zawiera Twój niestandardowy model użytkownika (ze względu na przewodnik, nazwiemy go accounts oraz model User ).W tym momencie jeszcze nie mieć niestandardowy model użytkownika.

    $ ./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. Utwórz nową, pustą migrację użytkowników w aplikacji kont.

    $ ./manage.py schemamigration accounts --empty switch_to_custom_user
    Created 0002_switch_to_custom_user.py.
    
  3. Utwórz własnego User model w accounts aplikację, ale upewnij się, że jest zdefiniowana jako:

    class SiteUser(AbstractUser): pass
    
  4. Wypełnij pustą migrację następującym kodem.

    # 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. Uruchom migrację

    $ ./manage.py migrate accounts
     - Migrating forwards to 0002_switch_to_custom_user.
     > accounts:0002_switch_to_custom_user
     - Loading initial data for accounts.
    
  6. Wprowadź teraz wszelkie zmiany w swoim modelu użytkownika.

    # settings.py
    AUTH_USER_MODEL = 'accounts.User'
    
    # accounts/models.py
    class SiteUser(AbstractUser):
        site = models.ForeignKey(Site, null=True)
    
  7. utwórz i uruchom migracje dla tej zmiany

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

Szczerze mówiąc, jeśli już dobrze znasz swoją konfigurację i korzystasz już z południa, powinno to być tak proste, jak dodanie następującej migracji do modułu kont.

# 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:dodano zmianę nazwy tabeli auth_user_group. FKs zaktualizują się automatycznie, aby wskazać właściwą tabelę ze względu na ograniczenia bazy danych, ale nazwy tabel pól M2M są generowane na podstawie nazw 2 tabel końcowych i będą wymagały ręcznej aktualizacji w ten sposób.

EDYCJA 2:Podziękowania dla @Tuttle i @pix0r za poprawki.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przechowywanie zaszyfrowanych danych w Postgres

  2. Zapytanie o elementy tablicy wewnątrz typu JSON

  3. Nie można połączyć się z bazą danych heroku postgresql z aplikacji lokalnego węzła za pomocą sequelize

  4. Wiele generatorów sekwencji Hibernate dla jednej jednostki z PostgreSQL

  5. Jak zatrzymać/zabić zapytanie w postgresql?