South と格闘するのにうんざりしていたので、実際にはこれを別の方法で行うことになり、私の特定の状況ではうまくいきました。
まず、./manage.py dumpdata で動作させ、ダンプを修正してから、./manage.py loaddata で動作させました。その後、必要な django 設定のみをロードし、シリアライゼーション/デシリアライゼーションを直接実行する単一の自己完結型スクリプトを使用して、基本的に同じことができることに気付きました。
自己完結型の Python スクリプト
## userconverter.py ##
import json
from django.conf import settings
settings.configure(
DATABASES={
# copy DATABASES configuration from your settings file here, or import it directly from your settings file (but not from django.conf.settings) or use dj_database_url
},
SITE_ID = 1, # because my custom user implicates contrib.sites (which is why it's in INSTALLED_APPS too)
INSTALLED_APPS = ['django.contrib.sites', 'django.contrib.auth', 'myapp'])
# some things you have to import after you configure the settings
from django.core import serializers
from django.contrib.auth.models import User
# this isn't optimized for huge amounts of data -- use streaming techniques rather than loads/dumps if that is your case
old_users = json.loads(serializers.serialize('json', User.objects.all()))
for user in old_users:
user['pk'] = None
user['model'] = "myapp.siteuser"
user['fields']["site"] = settings['SITE_ID']
for new_user in serializers.deserialize('json', json.dumps(old_users)):
new_user.save()
ダンプデータ/ロードデータを使用
私は次のことをしました:
1) ./manage.py dumpdata auth.User
2) auth.user データを新しいユーザーに変換するスクリプト。(または、お気に入りのテキストエディタまたはgrepで手動で検索して置換するだけです)私のものは次のようになりました:
def convert_user_dump(filename, site_id):
file = open(filename, 'r')
contents = file.read()
file.close()
user_list = json.loads(contents)
for user in user_list:
user['pk'] = None # it will auto-increment
user['model'] = "myapp.siteuser"
user['fields']["site"] = side_id
contents = json.dumps(user_list)
file = open(filename, 'w')
file.write(contents)
file.close()
3) ./manage.py ロードデータ ファイル名
4) AUTH_USER_MODEL を設定する
*補足: このタイプの移行を行う際の重要な部分の 1 つは、使用する手法 (South、シリアル化/変更/逆シリアル化、またはその他) に関係なく、現在の設定で AUTH_USER_MODEL をカスタム モデルに設定するとすぐに、django です。テーブルがまだ存在していても、auth.User から切り離します。*