6

我有许多具有历史悠久的南方初始迁移的应用程序,我想将其转换为适用的 django 1.5。因此,我将迁移文件中的所有 orm['auth.User'] 引用替换为自定义引用,但是当我尝试运行这些迁移时,出现以下错误:

迁移错误:django_notify:0001_initial KeyError:“应用程序'profiles'中的模型'customuser'在此迁移中不可用。”

有问题的迁移是这样的:http: //bpaste.net/show/2CwaYrlNifNTd5gcHUfK/

我的自定义用户类是:

class CustomUser(AbstractUser):
    image = models.ImageField(_('Image Field'), upload_to='user_images')

我也无法使用 convert_to_south 命令将我的“个人资料”应用程序转换为南。我收到以下错误:

在'/Users/tejinder/Projects/basidia/apps/profiles/migrations'中创建init .py ...

  • 添加了模型配置文件.CustomUser

    • 为profiles.CustomUser上的组添加了M2M表

    • 为 profile.CustomUser 上的 user_permissions 添加了 M2M 表

创建 0001_initial.py。您现在可以通过以下方式应用此迁移:./manage.py migrate profiles

CommandError:一个或多个模型未验证:auth.user:模型已被替换为尚未安装或抽象的“profiles.CustomUser”。

可能出了什么问题?提前致谢。

4

2 回答 2

12

看到这个答案:Migrating existing auth.User data to new Django 1.5 custom user model?

对于从自定义用户模型开始可能遇到类似问题的其他人:

如果您使用 'django.contrib.auth' 并拥有自定义用户模型,则如果您的自定义用户模型未包含在已安装的应用程序中,则无法运行 syncdb。你会得到这个错误

CommandError:一个或多个模型未验证:auth.user:模型已被替换为尚未安装或抽象的“myapp.User”。admin.logentry: 'user' 与模型 myapp.User 有关系,该模型要么尚未安装,要么是抽象的。

因此,要解决此问题,您需要在已安装的应用程序中包含包含用户模型的应用程序,现在当您运行 syncdb 时,它将为您自己的模型添加所有表。因此,您必须将您的应用程序转换为南,因为表已经创建。

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 时,您仍然会收到上述错误,但您现在可以忽略它。南方文件说:

convert_to_south:So​​uth 将自动进行并假装应用您的第一次迁移

我认为问题在于模型验证导致 convert_to_south 在假装(--fake)应用您的第一次迁移之前出错。

所以解决方法是基本上做被跳过的假迁移。

于 2013-02-26T19:31:36.263 回答
0

前几天我解决了同样的问题,所以我想其他人可能会觉得这很有用。在 South 兼容 Django 1.5+ 之前创建迁移时会发生这种情况。我在我的 Django 站点中使用 PybbM 论坛应用程序时遇到了类似的问题。解决方案是将您的模型和相关模型包含到旧的迁移 ORM 中。有两种方法可以做到这一点:

1) 您可以在每个失败的迁移文件底部的“模型”列表中手动输入您的模型。2) 使用您现有的传递迁移之一作为模板,并将所需的 orm 模型复制到最后。

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

*请记住,您还需要复制自定义用户可能需要的任何相关模型,因此对于我为您制作的自定义用户,您需要复制“ranks.rank”、“ranks.ranktest” ' 和 'schools.school'

于 2013-08-22T16:59:48.733 回答