如何在保留现有数据的同时修补用户模型?

时间:2018-05-03 17:11:12

标签: python django django-authentication django-1.7

我有一个很大的Django应用程序,目前尝试从1.6升级到1.7(尝试直接升级到1.11,但是它太麻烦了,所以我的计划是在一个小的时间)。

我按照Upgrade from South说明删除了所有以前的迁移,但我无法让makemigrations工作。目前的问题是auth.User模型已修补为包含两个新字段:

User.add_to_class('profile',
                  models.ForeignKey('access.Profile', null=True, blank=True,
                                    related_name='user_foreignkey'))
User.add_to_class('profiles', 
                  models.ManyToManyField('access.Profile', null=True,
                                         blank=True))

此补丁是在一个单独的应用程序中制作的。如果我将它保留在原来的位置,运行python manage.py makemigrations时会出现以下错误:

ValueError: Lookup failed for model referenced by field auth.User.profiles:
access.Profiles

我尝试将add_to_class调用移动到定义Profile的同一文件中(定义之后),但得到了相同的错误。我还尝试将语法从'access.Profile'更改为Profile,但没效果。是否有其他东西可以使这项工作?

如果没有,由于我在模型中添加字段,我认为正确的方法是扩展AbstractUser模型,如this guide所示。这样做的问题是,新的初始迁移将创建表access_user,而不是使用现有的auth_user。简单地将auth_user重命名为access_user并假冒迁移是否安全?

有关如何以最少的重构来解决这个问题的任何其他建议(管理层总是认为比升级更紧急的事情)是受欢迎的。

1 个答案:

答案 0 :(得分:0)

tl,博士;我删除了auth次迁移并再次运行makemigrations,这似乎解决了这个问题。

我决定尝试选项2。我删除了add_to_class个修补程序,使用新字段创建了新的class User(AbstractUser),删除了所有现有的迁移并再次运行makemigrations。我得到了完全相同的错误,这没有任何意义,因为不再有auth.UserProfile相关的代码,所以我决定调查auth迁移。我跑了

$ python migrate --list settings=settings.mysettings

它显示了auth的可疑迁移,与昨天的日期有关,可能是在我第一次尝试进行迁移时。

关于“如何重置所有迁移”的教程没有提到第三方安装的应用程序,但感谢this thread我知道Django存储了身份验证迁移的位置,所以我删除了它们(初始和可疑)一个)并重新排序INSTALLED_APPS,以便access现在在django.contrib.auth之前。然后再次运行makemigrations,并成功完成accessauth次迁移。

我现在在其他应用程序中遇到其他迁移问题,但它们似乎与此无关。

以更直观的方式重置所有现有迁移,而不仅仅是来自您的仓库的迁移,这可能会更好。但话说回来,我认为add_to_class补丁并不是做我们想做的事情的正确方法。