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
)
-
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 modellenUser
). 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.
-
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.
-
Skapa din anpassade
User
modell iaccounts
app, men se till att den är definierad som:class SiteUser(AbstractUser): pass
-
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
-
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.
-
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)
-
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.