python - 如何在保留现有数据的同时修补用户模型?
问题描述
我有一个很大的 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_user
并access_user
伪造迁移是否安全?
欢迎任何其他关于如何以最少的重构来克服这个问题的建议(管理层总是认为有比升级更紧迫的事情)。
解决方案
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
再次运行,它通过access
并auth
成功迁移。
我现在在其他应用程序中遇到了其他迁移问题,但它们似乎与此无关。
有一种更直观的方式来重置所有现有迁移可能会很好,而不仅仅是那些来自您的存储库的迁移。但话又说回来,我不认为add_to_class
补丁是做我们想要的正确方法。
推荐阅读
- botframework - 不带参数的 MessageReceivedAsync 调用
- android - Infinite/Circular Recyclerview,smothScrollToPosition 指向错误的索引
- sql-server - SAP PowerDesigner 数据库错误
- c++ - 错误:“类 QComboBox”没有名为“setCurrentText”的成员;
- appium-ios - 如果 ios 应用程序没有唯一的可访问性 id 并且开发人员还没有准备好提供解决方案,如何克服?
- python - 使用 pandas 将多个 csv 文件读入单独的数据帧
- python - 搜索重复项并将其删除
- python - 基于形状的 numpy 数组的分组列表。熊猫?
- css - CSS:将宽度/高度设置为表格标题列的百分比减去像素
- excel - 在文本中查找具有已知格式的未知字符串