South ist mehr als in der Lage, diese Migration für Sie durchzuführen, aber Sie müssen schlau sein und es in Etappen tun. Hier ist die Schritt-für-Schritt-Anleitung:(Diese Anleitung setzt voraus, dass Sie AbstractUser
ableiten , nicht AbstractBaseUser
)
-
Stellen Sie vor dem Wechsel sicher, dass die South-Unterstützung in der Anwendung aktiviert ist, die Ihr benutzerdefiniertes Benutzermodell enthält (der Anleitung halber nennen wir es
accounts
). und das ModellUser
).An dieser Stelle sollten Sie noch nicht ein benutzerdefiniertes Benutzermodell haben.$ ./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.
-
Erstellen Sie eine neue, leere Benutzermigration in der Konten-App.
$ ./manage.py schemamigration accounts --empty switch_to_custom_user Created 0002_switch_to_custom_user.py.
-
Erstellen Sie Ihren benutzerdefinierten
User
Modell in denaccounts
app, aber stellen Sie sicher, dass sie wie folgt definiert ist:class SiteUser(AbstractUser): pass
-
Füllen Sie die leere Migration mit dem folgenden Code aus.
# 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
-
Führen Sie die Migration aus
$ ./manage.py migrate accounts - Migrating forwards to 0002_switch_to_custom_user. > accounts:0002_switch_to_custom_user - Loading initial data for accounts.
-
Nehmen Sie jetzt alle Änderungen an Ihrem Benutzermodell vor.
# settings.py AUTH_USER_MODEL = 'accounts.User' # accounts/models.py class SiteUser(AbstractUser): site = models.ForeignKey(Site, null=True)
-
Migrationen für diese Änderung erstellen und ausführen
$ ./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.
Ehrlich gesagt, wenn Sie sich bereits gut mit Ihrem Setup auskennen und South bereits verwenden, sollte es so einfach sein, die folgende Migration zu Ihrem Kontomodul hinzuzufügen.
# 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
BEARBEITEN 05.02.13:Umbenennung für die Tabelle auth_user_group hinzugefügt. FKs werden aufgrund von DB-Einschränkungen automatisch aktualisiert, um auf die richtige Tabelle zu verweisen, aber die Tabellennamen von M2M-Feldern werden aus den Namen der beiden Endtabellen generiert und müssen auf diese Weise manuell aktualisiert werden.
EDIT 2:Danke an @Tuttle &@pix0r für die Korrekturen.