我有一个很大的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
并假冒迁移是否安全?
有关如何以最少的重构来解决这个问题的任何其他建议(管理层总是认为比升级更紧急的事情)是受欢迎的。
答案 0 :(得分:0)
tl,博士;我删除了auth
次迁移并再次运行makemigrations
,这似乎解决了这个问题。
我决定尝试选项2。我删除了add_to_class
个修补程序,使用新字段创建了新的class User(AbstractUser)
,删除了所有现有的迁移并再次运行makemigrations
。我得到了完全相同的错误,这没有任何意义,因为不再有auth.User
与Profile
相关的代码,所以我决定调查auth
迁移。我跑了
$ python migrate --list settings=settings.mysettings
它显示了auth
的可疑迁移,与昨天的日期有关,可能是在我第一次尝试进行迁移时。
关于“如何重置所有迁移”的教程没有提到第三方安装的应用程序,但感谢this thread我知道Django存储了身份验证迁移的位置,所以我删除了它们(初始和可疑)一个)并重新排序INSTALLED_APPS
,以便access
现在在django.contrib.auth
之前。然后再次运行makemigrations
,并成功完成access
和auth
次迁移。
我现在在其他应用程序中遇到其他迁移问题,但它们似乎与此无关。
以更直观的方式重置所有现有迁移,而不仅仅是来自您的仓库的迁移,这可能会更好。但话说回来,我认为add_to_class
补丁并不是做我们想做的事情的正确方法。