Юг е повече от способен да направи тази миграция вместо вас, но трябва да сте умни и да го правите на етапи. Ето ръководството стъпка по стъпка:(Това ръководство предполагаше, че имате подклас AbstractUser
, а не AbstractBaseUser
)
-
Преди да превключите, уверете се, че поддръжката на юг е активирана в приложението, което съдържа вашия персонализиран потребителски модел (в името на ръководството ще го наречем
accounts
и моделътUser
).В този момент не трябва да все още имат персонализиран потребителски модел.$ ./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.
-
Създайте нова, празна миграция на потребители в приложението за акаунти.
$ ./manage.py schemamigration accounts --empty switch_to_custom_user Created 0002_switch_to_custom_user.py.
-
Създайте своя персонализиран
User
модел вaccounts
приложение, но се уверете, че е дефинирано като:class SiteUser(AbstractUser): pass
-
Попълнете празното мигриране със следния код.
# 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
-
Изпълнете миграцията
$ ./manage.py migrate accounts - Migrating forwards to 0002_switch_to_custom_user. > accounts:0002_switch_to_custom_user - Loading initial data for accounts.
-
Направете промени в потребителския си модел сега.
# settings.py AUTH_USER_MODEL = 'accounts.User' # accounts/models.py class SiteUser(AbstractUser): site = models.ForeignKey(Site, null=True)
-
създайте и стартирайте миграции за тази промяна
$ ./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.
Честно казано, ако вече имате добри познания за настройката си и вече използвате юг, трябва да е толкова просто, колкото да добавите следната миграция към модула на вашите акаунти.
# 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
РЕДАКТИРАНЕ 2/5/13:добавено преименуване на таблицата auth_user_group. FK автоматично ще се актуализира, за да сочи правилната таблица поради ограничения на db, но имената на таблиците на M2M полета се генерират от имената на двете крайни таблици и ще се нуждаят от ръчно актуализиране по този начин.
РЕДАКТИРАНЕ 2:Благодаря на @Tuttle &@pix0r за корекциите.