Syd er mere end i stand til at udføre denne migrering for dig, men du skal være smart og gøre det i etaper. Her er den trinvise vejledning:(Denne vejledning forudsatte, at du underklasser AbstractUser
, ikke AbstractBaseUser
)
-
Før du skifter, skal du sørge for, at syd-understøttelse er aktiveret i applikationen, der indeholder din brugerdefinerede brugermodel (af hensyn til vejledningen kalder vi det
accounts
og modellenUser
). På dette tidspunkt bør du ikke endnu har en tilpasset brugermodel.$ ./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.
-
Opret en ny, tom brugermigrering i konto-appen.
$ ./manage.py schemamigration accounts --empty switch_to_custom_user Created 0002_switch_to_custom_user.py.
-
Opret din tilpassede
User
model iaccounts
app, men sørg for, at den er defineret som:class SiteUser(AbstractUser): pass
-
Udfyld den tomme migrering med følgende kode.
# 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
-
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.
-
Foretag ændringer i din brugermodel nu.
# settings.py AUTH_USER_MODEL = 'accounts.User' # accounts/models.py class SiteUser(AbstractUser): site = models.ForeignKey(Site, null=True)
-
oprette og køre migreringer til denne æ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.
Helt ærligt, hvis du allerede har et godt kendskab til din opsætning og allerede bruger syd, burde det være så enkelt som at tilføje følgende migrering til dit 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:tilføjet omdøbning for auth_user_group tabel. FK'er vil automatisk opdatere til at pege på den korrekte tabel på grund af db-begrænsninger, men M2M-felters tabelnavne genereres ud fra navnene på de 2 endetabeller og skal manuelt opdateres på denne måde.
EDIT 2:Tak til @Tuttle &@pix0r for rettelserne.