无法使用django 1.5 Custom用户类执行数据迁移

时间:2013-02-01 11:50:07

标签: django django-south django-1.5

我有许多应用程序具有历史性的南初始迁移,我想将其转换为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命令将my'profiles'应用转换为南方。我收到以下错误:

  

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

     
      
  • 添加了模型profiles.CustomUser

         
        
    • 在profiles.CustomUser

    • 上为群组添加了M2M表   
    • 在profiles.CustomUser上为user_permissions添加了M2M表

    •   
  •   
     

创建了0001_initial.py。您现在可以将此迁移应用于:./ manage.py迁移配置文件

     

CommandError:一个或多个模型未验证:   auth.user:模型已被换出'profiles.CustomUser',它尚未安装或是抽象的。

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

2 个答案:

答案 0 :(得分: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时,仍然会收到上述错误,但您现在可以忽略它。 South documentation说:

  

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

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

因此,解决方法是基本上执行跳过的虚假迁移。

答案 1 :(得分:0)

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

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

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

*请注意,您还需要复制自定义用户可能需要的任何相关模型,因此,如果我为您制作了自定义用户,则需要复制“ranking.rank”, rank.ranktest'和'schools.school'