【问题标题】:How can I patch the User model while keeping existing data?如何在保留现有数据的同时修补用户模型?
【发布时间】:2018-10-14 02:13:38
【问题描述】:

我有一个很大的 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 并伪造迁移是否安全?

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

【问题讨论】:

  • 不建议删除迁移文件,除非您知道自己在做什么,或者完全重新启动您的项目(包括数据库)
  • @Lemayzeur 删除迁移(文件,而不是从数据库中)是Update from South 说明的一部分。

标签: python django django-authentication django-1.7


【解决方案1】:

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 补丁是做我们想做的事情的正确方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    相关资源
    最近更新 更多