首页 > 解决方案 > 如何在保留现有数据的同时修补用户模型?

问题描述

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

我正在遵循从南方升级的说明,并删除了所有以前的迁移,但我无法开始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'to更改Profile为无效。还有其他东西可以使这项工作吗?

如果不是,由于我正在向模型添加字段,我认为正确的方法是扩展 AbstractUser 模型,正如本指南所建议的那样。这样做的问题是新的初始迁移将创建一个表access_user,而不是使用现有的auth_user. 简单地重命名auth_useraccess_user伪造迁移是否安全?

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

标签: pythondjangodjango-authenticationdjango-1.7

解决方案


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

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

$ python migrate --list settings=settings.mysettings

并且它显示了一个可疑的迁移auth,对于昨天的日期,可能是我第一次尝试进行迁移时。

关于“如何重置所有迁移”的教程没有提到第三方安装的应用程序,但是由于这个线程我知道 Django 将身份验证迁移存储在哪里,所以我删除了它们(初始的和可疑的)并重新排序INSTALLED_APPS了那access是现在以前django.contrib.auth。然后makemigrations再次运行,它通过accessauth成功迁移。

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

有一种更直观的方式来重置所有现有迁移可能会很好,而不仅仅是那些来自您的存储库的迁移。但话又说回来,我不认为add_to_class补丁是做我们想要的正确方法。


推荐阅读