Nam có nhiều khả năng thực hiện việc di chuyển này cho bạn, nhưng bạn cần phải thông minh và thực hiện theo từng giai đoạn. Đây là hướng dẫn từng bước:(Hướng dẫn này giả định trước cho bạn lớp con AbstractUser
, không phải AbstractBaseUser
)
-
Trước khi thực hiện chuyển đổi, hãy đảm bảo rằng hỗ trợ phía nam được bật trong ứng dụng có chứa mô hình người dùng tùy chỉnh của bạn (vì lợi ích của hướng dẫn, chúng tôi sẽ gọi nó là
accounts
và mô hìnhUser
). Tại thời điểm này, bạn chưa nên có một mô hình người dùng tùy chỉnh.$ ./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.
-
Tạo di chuyển người dùng trống, mới trong ứng dụng tài khoản.
$ ./manage.py schemamigration accounts --empty switch_to_custom_user Created 0002_switch_to_custom_user.py.
-
Tạo
User
tùy chỉnh của bạn mô hình trongaccounts
ứng dụng, nhưng hãy đảm bảo rằng nó được định nghĩa là:class SiteUser(AbstractUser): pass
-
Điền vào phần di chuyển trống với mã sau.
# 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
-
Chạy quá trình di chuyển
$ ./manage.py migrate accounts - Migrating forwards to 0002_switch_to_custom_user. > accounts:0002_switch_to_custom_user - Loading initial data for accounts.
-
Thực hiện bất kỳ thay đổi nào đối với mô hình người dùng của bạn ngay bây giờ.
# settings.py AUTH_USER_MODEL = 'accounts.User' # accounts/models.py class SiteUser(AbstractUser): site = models.ForeignKey(Site, null=True)
-
tạo và chạy di chuyển cho thay đổi này
$ ./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.
Thành thật mà nói, nếu bạn đã có kiến thức tốt về thiết lập của mình và đã sử dụng phía nam, thì việc này sẽ đơn giản như việc thêm di chuyển sau vào mô-đun tài khoản của bạn.
# 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
CHỈNH SỬA 2/5/13:đã thêm đổi tên cho bảng auth_user_group. FK sẽ tự động cập nhật để trỏ đến đúng bảng do các ràng buộc của db, nhưng tên bảng của trường M2M được tạo từ tên của 2 bảng cuối và sẽ cần cập nhật thủ công theo cách này.
CHỈNH SỬA 2:Cảm ơn @Tuttle &@ pix0r đã chỉnh sửa.