J'en ai eu assez de lutter contre le Sud, j'ai donc fini par faire les choses différemment et cela a bien fonctionné dans ma situation particulière :
Tout d'abord, j'ai fait fonctionner ./manage.py dumpdata, en corrigeant le dump, puis ./manage.py loaddata, ce qui a fonctionné. Puis j'ai réalisé que je pouvais faire à peu près la même chose avec un seul script autonome qui ne charge que les paramètres nécessaires de django et fait la sérialisation/désérialisation directement.
Script python autonome script.
## 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()
Avec dumpdata/loaddata
J'ai procédé comme suit :
1) ./manage.py dumpdata auth.User
2) script pour convertir les données auth.user en nouvel utilisateur. (ou recherchez et remplacez manuellement dans votre éditeur de texte favori ou grep) Le mien ressemblait à quelque chose comme :
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 nom du fichier loaddata
4) définir AUTH_USER_MODEL
*Note secondaire : Une partie critique de ce type de migration, quelle que soit la technique utilisée (Sud, sérialisation/modification/désérialisation, ou autre) est que dès que vous définissez AUTH_USER_MODEL à votre modèle personnalisé dans les paramètres actuels, django vous coupe de auth.User, même si la table existe toujours*.