我没有使用 django 的 auth 模块,而是使用了自己的模块,并且已经非常后悔了。
为了纠正这种情况,我正在尝试将数据从我的用户模型迁移到 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...
当我运行迁移时,出现此错误(回溯):
#...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
会明白。
说了这么多,我该怎么做呢?考虑到我所处的洞,最优雅的解决方案是什么?
提前致谢。
Update 1
正如建议的史蒂夫贾林 https://stackoverflow.com/users/79225/stevejalim,我尝试使用User
's 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'
我确实发现了一个提示南方文献 http://south.aeracode.org/docs/ormfreezing.html#rationale-behind-the-serialisation其中指出:
南方并没有冻结每一个方面
模型;例如,事实并非如此
保留新的管理器或自定义模型
方法,因为这些需要
序列化运行的Python代码
这些方法(以及代码
取决于,等等)。
如果您想在您的
移民,你必须复制
代码输入,包括任何导入
依靠工作。但请记住,
对于您添加的每个导入,您
承诺保持进口有效
为了生活,为了迁徙。
我想问题仍然存在,最好/最安全的方法是什么?复制set_password(...)
方法结束?创建一个为我散列密码的函数?还有其他想法吗?