无法使用Django 1.5自定义用户类执行数据迁移

6
我有很多涉及历史南方迁移的应用程序,我想将其转换为适用于Django 1.5的应用程序。因此,我在迁移文件中用自定义的orm['auth.User']替换了所有的引用,但是当我尝试运行这些迁移时,出现以下错误:
迁移错误:django_notify:0001_initial KeyError:“来自'profiles'应用程序的'model customuser'在此迁移中不可用。”
相关的迁移如下所示: http://bpaste.net/show/2CwaYrlNifNTd5gcHUfK/ 我的自定义用户类是:
class CustomUser(AbstractUser):
    image = models.ImageField(_('Image Field'), upload_to='user_images')

我无法使用convert_to_south命令将我的 'profiles' 应用程序转换为south。我收到以下错误消息:
在'/Users/tejinder/Projects/basidia/apps/profiles/migrations'中创建init.py... 添加模型profiles.CustomUser 为profiles.CustomUser添加了groups的M2M表 为profiles.CustomUser添加了user_permissions的M2M表 创建0001_initial.py。您现在可以使用以下命令应用此迁移:./manage.py migrate profiles 命令错误:一个或多个模型未验证: auth.user:该模型已被替换为尚未安装或抽象的 'profiles.CustomUser'。
可能出了什么问题?谢谢。

我认为这个问题与South有关:http://south.aeracode.org/ticket/1179,目前还没有解决。 - L42y
2个回答

12

请参考这个答案:将现有的auth.User数据迁移到新的Django 1.5自定义用户模型?

对于其他可能遇到类似问题的人:

如果你正在使用'django.contrib.auth'并且有一个自定义的用户模型,你不能运行syncdb而不包括你的自定义用户模型在已安装的应用程序中。否则你会收到以下错误:

CommandError: One or more models did not validate: auth.user: Model has been swapped out for 'myapp.User' which has not been installed or is abstract. admin.logentry: 'user' has a relation with model myapp.User, which has either not been installed or is abstract.

因此,你需要将包含你的用户模型的应用程序包含在已安装的应用程序中,这样当你运行syncdb时,它将添加所有你自己模型的表格。因此,你必须将你的应用程序转换为south,因为表已经被创建。

python manage.py syncdb
python manage.py migrate
python manage.py convert_to_south myapp

这将创建0001_initial并出现以下错误:
CommandError: 一个或多个模型未通过验证:auth.user:该模型已被替换为未安装或抽象的“myapp.User”。

解决方法:

python manage.py syncdb
python manage.py migrate
python manage.py convert_to_south myapp
python manage.py migrate myapp 0001 --fake

当你运行convert_to_south时,你仍然会遇到上述错误,但现在可以忽略它。South documentation说:

convert_to_south:South将自动制作并假装应用您的第一个迁移

我认为问题是模型验证导致convert_to_south在假装(--fake)应用您的第一个迁移之前出错。
因此,解决方法基本上是执行被跳过的虚拟迁移。

0

我前几天解决了这个问题,所以我想其他人也可能会发现这很有用。当迁移是在South没有Django 1.5+兼容性之前创建的时,就会出现这个问题。我在我的Django网站中使用PybbM Forum App时也遇到了类似的问题。解决方案是将您的模型和相关模型包含在旧的迁移ORM中。有两种方法可以做到这一点:

1)您可以手动输入"models"列表中的模型,放在每个失败的迁移文件底部。 2)使用现有的通过迁移之一作为模板,并将所需的ORM模型复制到末尾。

示例:http://bpaste.net/show/Pv20CM5dTrbubzFZtiRY/

*请记住,您还需要复制任何相关模型,以便您的自定义用户所需,所以对于我为您创建的自定义用户,您需要复制“ranks.rank”、“ranks.ranktest”和“schools.school”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接