Migracja istniejącego auth.Dane użytkownika do nowego modelu użytkownika Django 1.5?

Wolałbym nie niszczyć wszystkich użytkowników na mojej stronie. Ale chcę skorzystać z niestandardowego modelu wtykowego Django 1.5. Oto mój nowy model użytkownika:

class SiteUser(AbstractUser):
    site = models.ForeignKey(Site, null=True)

Wszystko działa z moim nowym modelem na nowej instalacji(mam inny kod, wraz z dobrym powodem, aby to zrobić - wszystkie są tutaj nieistotne). Ale jeśli umieszczę to na mojej stronie na żywo i syncdb & migrate, stracę wszystkich moich użytkowników lub przynajmniej będą w innej, osieroconej tabeli niż nowa tabela stworzona dla mojego nowy model.

Znam South, ale na podstawie tego postu i kilku prób z mojej strony, wydaje się, że jego migracje danych nie są obecnie odpowiednie dla tej migracji specyficznej. Więc szukam jakiegoś sposobu, aby albo South pracować dla tego lub dla jakiejś migracji non-South (surowy SQL, dumpdata / loaddata, lub w inny sposób), które mogę uruchomić na każdym z moich serwerów (Postgres 9.2), aby przenieść użytkowników po utworzeniu nowej tabeli, podczas gdy stary auth.User table jest jeszcze w baza danych.

Author: Ben Roberts, 0000-00-00

2 answers

Południe jest bardziej niż w stanie zrobić tę migrację za ciebie, ale musisz być mądry i robić to etapami. Oto przewodnik krok po kroku: (ten przewodnik zakłada podklasę AbstractUser, a nie AbstractBaseUser)

  1. Przed wykonaniem przełącznika upewnij się, że obsługa south jest włączona w aplikacji Zawiera Twój niestandardowy model użytkownika(dla dobra przewodnika nazwiemy go accounts i model User). W tym momencie powinieneś Jeszcze nie mieć niestandardowego użytkownika model.

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

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

    class SiteUser(AbstractUser): pass
    
  4. Wypełnij pustą migrację poniższym 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. Dokonaj zmian w modelu użytkownika teraz.

    # settings.py
    AUTH_USER_MODEL = 'accounts.User'
    
    # accounts/models.py
    class SiteUser(AbstractUser):
        site = models.ForeignKey(Site, null=True)
    
  7. Tworzenie i uruchamianie migracji dla tego Zmień

    $ ./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 masz już dobrą znajomość konfiguracji i już korzystasz z south, powinno 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 automatycznie zaktualizuje, aby wskazać prawidłową tabelę z powodu ograniczeń db, ale nazwy tabel pól M2M są generowane z nazw 2 tabel końcowych i będą wymagały ręcznej aktualizacji w ten sposób.

Edycja 2: Podziękowania dla @ Tuttle & @ pix0r za poprawki.

 48
Author: Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-21 01:18:34

Mój niesamowicie leniwy sposób na to:

  1. Utwórz nowy model (użytkownika), rozszerzając AbstractUser. W nowym modelu, w Meta, nadpisuje db_table i ustawia na 'auth_user'.

  2. Utwórz migrację początkową przy użyciu South.

  3. Migrate, ale sfałszować migrację, używając --fake podczas uruchamiania migrate.

  4. Dodaj nowe pola, Utwórz migrację, uruchom ją normalnie.

To nie jest leniwe, ale działa. Teraz masz 1.5 zgodny Model użytkownika, który wykorzystuje tylko starą tabelę użytkowników. Masz również odpowiednią historię migracji.

Można to później naprawić za pomocą ręcznych migracji, aby zmienić nazwę tabeli.

 15
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-25 18:28:26