South is meer dan in staat om deze migratie voor je te doen, maar je moet slim zijn en het in fasen doen. Hier is de stap-voor-stap handleiding:(Deze handleiding veronderstelde dat je subklasse AbstractUser
, niet AbstractBaseUser
)
-
Voordat u overstapt, moet u ervoor zorgen dat South-ondersteuning is ingeschakeld in de toepassing die uw aangepaste gebruikersmodel bevat (voor de handleiding noemen we het
accounts
en het modelUser
).Op dit punt moet u nog niet een aangepast gebruikersmodel hebben.$ ./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.
-
Maak een nieuwe, lege gebruikersmigratie aan in de account-app.
$ ./manage.py schemamigration accounts --empty switch_to_custom_user Created 0002_switch_to_custom_user.py.
-
Maak uw aangepaste
User
model in deaccounts
app, maar zorg ervoor dat deze is gedefinieerd als:class SiteUser(AbstractUser): pass
-
Vul de lege migratie in met de volgende code.
# 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
-
Voer de migratie uit
$ ./manage.py migrate accounts - Migrating forwards to 0002_switch_to_custom_user. > accounts:0002_switch_to_custom_user - Loading initial data for accounts.
-
Breng nu wijzigingen aan in uw gebruikersmodel.
# settings.py AUTH_USER_MODEL = 'accounts.User' # accounts/models.py class SiteUser(AbstractUser): site = models.ForeignKey(Site, null=True)
-
migraties maken en uitvoeren voor deze wijziging
$ ./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.
Eerlijk gezegd, als je al een goede kennis hebt van je setup en al South gebruikt, zou het zo simpel moeten zijn als het toevoegen van de volgende migratie aan je accountmodule.
# 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:hernoemen toegevoegd voor auth_user_group tabel. FK's worden automatisch bijgewerkt om naar de juiste tabel te wijzen vanwege db-beperkingen, maar de tabelnamen van M2M-velden worden gegenereerd op basis van de namen van de 2 eindtabellen en moeten op deze manier handmatig worden bijgewerkt.
EDIT 2:Met dank aan @Tuttle &@pix0r voor de correcties.