Как я получаю доступ к Пользователю objects.create_user подлинного Пользователя (…) в южной миграции?

Вместо того, чтобы использовать подлинный модуль django я использовал свое собственное и уже сожалею о нем много.

Чтобы исправить ситуацию, я пытаюсь переместить данные от своей модели User до django.auth.models. Пользователь.

Я создал миграцию данных следующим образом:

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, который выполняет их метод (и код, который зависит от, и т.д).

Если Вы хотите пользовательские методы в своей миграции, необходимо будет скопировать код в, включая любой импорт, на который это полагается для работы. Помните, однако, для каждого импорта, что Вы добавляете, Вы обещаете сохранить тот импорт допустимым для жизни для миграции.

Я предполагаю, что вопрос остается, каков лучший/самый безопасный способ сделать это? Скопируйте set_password(...) метод? Создайте функцию, которая хеширует пароль для меня? Какие-либо другие идеи?

14
задан Community 23 May 2017 в 12:09
поделиться

1 ответ

Почему бы не сделать User вручную, а затем установить пароль после того, как он был save()d с newUser.set_password()? Да, вам нужно будет дважды ударить по БД, но это не очень хорошая встряска.

1
ответ дан 1 December 2019 в 14:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: