【问题标题】:Can't perform data migrations using django 1.5 Custom user class无法使用 django 1.5 自定义用户类执行数据迁移
【发布时间】:2013-01-16 17:29:10
【问题描述】:

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

迁移错误:django_notify:0001_initial KeyError:“应用‘配置文件’中的模型‘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”。

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

【问题讨论】:

标签: django django-south django-1.5


【解决方案1】:

看到这个答案: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 时,您将仍然收到上述错误,但您现在可以忽略它。 South documentation 说:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-06-08
      • 2013-01-31
      • 2018-11-03
      • 1970-01-01
      • 2015-08-20
      • 2012-07-15
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      相关资源
      最近更新 更多