Selatan lebih dari mampu melakukan migrasi ini untuk Anda, tetapi Anda harus pintar dan melakukannya secara bertahap. Berikut panduan langkah demi langkah:(Panduan ini mengandaikan Anda subkelas AbstractUser
, bukan AbstractBaseUser
)
-
Sebelum beralih, pastikan bahwa dukungan selatan diaktifkan di aplikasi yang berisi model pengguna khusus Anda (demi panduan ini, kami akan menyebutnya
accounts
dan modelUser
).Pada titik ini Anda seharusnya belum memiliki model pengguna khusus.$ ./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.
-
Buat migrasi pengguna baru yang kosong di aplikasi akun.
$ ./manage.py schemamigration accounts --empty switch_to_custom_user Created 0002_switch_to_custom_user.py.
-
Buat
User
khusus Anda model diaccounts
aplikasi, tetapi pastikan itu didefinisikan sebagai:class SiteUser(AbstractUser): pass
-
Isi migrasi kosong dengan kode berikut.
# 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
-
Jalankan migrasi
$ ./manage.py migrate accounts - Migrating forwards to 0002_switch_to_custom_user. > accounts:0002_switch_to_custom_user - Loading initial data for accounts.
-
Buat perubahan apa pun pada model pengguna Anda sekarang.
# settings.py AUTH_USER_MODEL = 'accounts.User' # accounts/models.py class SiteUser(AbstractUser): site = models.ForeignKey(Site, null=True)
-
buat dan jalankan migrasi untuk perubahan ini
$ ./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.
Sejujurnya, Jika Anda sudah memiliki pengetahuan yang baik tentang penyiapan Anda dan sudah menggunakan selatan, Ini harus sesederhana menambahkan migrasi berikut ke modul akun Anda.
# 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:menambahkan ganti nama untuk tabel auth_user_group. FK akan otomatis memperbarui untuk menunjuk ke tabel yang benar karena batasan db, tetapi nama tabel bidang M2M dihasilkan dari nama 2 tabel akhir dan akan memerlukan pembaruan manual dengan cara ini.
EDIT 2:Terima kasih kepada @Tuttle &@pix0r atas koreksinya.