Вместо использования модуля django auth я использовал свои собственные и уже очень сожалею об этом.
Чтобы исправить ситуацию, я пытаюсь перенести данные из моей модели User на django.auth.models.User.
Я создал миграцию данных следующим образом:
def forwards(self, orm):
"""Migrate user information from mooi User model to auth User model."""
OldUser = orm['mooi.User']
User = orm['auth.User']
Profile = orm['mooi.Profile']
oldUsers = OldUser.objects.all()
for oldUser in oldUsers:
newUser = User.objects.create_user(username=oldUser.id, email=oldUser.email, password=oldUser.password)
# ...more irrelevant code follows...
Когда я запускаю миграцию, я получаю эту ошибку (traceback):
#...irrelevant traceback precedes...
File "[projdir]/mooi/migrations/0005_from_mooi_users_create_auth_users_with_profiles.py", line 18, in forwards
newUser = User.objects.create_user(username=oldUser.id, email=oldUser.email, password=oldUser.password)
File "[virtual_env_dir]lib/python2.6/site-packages/south/orm.py", line 397, in __getattr__
return getattr(self.real, name)
AttributeError: 'Manager' object has no attribute 'create_user'
После дальнейшего исследования я обнаружил, что Manager
, на которое ссылался, был временем south.orm.NoDryRunManager
, что объясняет ошибку.
Теперь мне даже нужна create_user
, чтобы создать хэш пароля, который будет django.contrib.auth
.
Сказав все это, как мне это сделать? Какое самое изящное решение, учитывая отверстие, в котором я нахожусь?!
Спасибо заранее.
Обновление 1
Как было предложено stevejalim, я попытался использовать User
set_password(...)
следующим образом:
newUser.set_password(raw_password=oldUser.password)
newUser.save()
Однако это не удалось с этой ошибкой:
File "[projdir]/mooi/migrations/0005_from_mooi_users_create_auth_users_with_profiles.py", line 21, in forwards
newUser.set_password(raw_password=oldUser.password)
AttributeError: 'User' object has no attribute 'set_password'
Я нашел подсказку в южной документации, которая гласит, что:
Юг не замерзает каждый аспект модель; например, он не делает сохранить новых менеджеров или пользовательскую модель методы, поскольку это потребует сериализация кода python, который выполняется этот метод (и код, который зависит от и т.д.).
Если вы хотите, чтобы в вашем миграции, вам придется скопировать код, включая любые импортные данные полагается на работу. Помните, однако, для каждого импорта, который вы добавляете, youre обещая сохранить этот импорт действительным для жизни для миграции.
Я думаю, вопрос остается, какой лучший/безопасный способ сделать это? Скопировать метод set_password(...)
? Создать функцию, которая хеширует пароль для меня? Любые другие идеи?