【问题标题】:Moving multiple models from one django app to another将多个模型从一个 django 应用程序移动到另一个
【发布时间】:2018-07-29 08:06:06
【问题描述】:

我正在使用 django v2.0.2 构建一个项目,该项目由 3 个应用程序和 24 个模型组成。其中一个应用程序有 14 个模型。在一个应用程序中拥有这么多模型变得越来越复杂,我想创建一个新应用程序并将几个模型移动到这个应用程序。

我发现an answer 解释了如何使用南来完成此操作。我一直在使用 django 核心迁移,并且由于不推荐使用南,我现在不想切换到南。

我要移动的模型非常复杂 - 它们有 ForeignKey 字段、ManyToMany 字段等。我需要一个工作流来展示如何使用 django 核心迁移来移动这些模型。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    这应该不难做到。您遇到的主要问题是 Django automatically derives 数据库表的名称来自模型类的名称和包含它的应用程序。

    这意味着除非您在模型元数据中明确设置 db_table 属性,否则与您的模型对应的所有表的名称都是根据应用程序/模型名称组合自动生成的。

    因此,如果您在 Blog 应用中有 Post 模型,则该 Post 模型的自动生成的表名称为 blog_post 。如果您决定将 Post 模型移动到 Article 应用程序中,Django 将寻找一个名为 article_post 的表并且无法将您的模型与正确的表相关联。

    要解决此问题,您需要在每个模型上显式设置 db_table 属性。 db_table 名称值必须对应于当前的应用程序/模型组合。因此,对于上面提到的 Post 模型,您可以将 db_table 设置为 blog_post。设置 db_table 属性后,您可以将模型移动到任何其他应用程序。

    class Post(models.Model):
        title = models.CharField(max_length=120)
    
        class Meta:
            db_table = 'blog_post'
    

    移动所有模型后,登录 django admin 以验证您的数据是否仍可通过新移动的模型访问。

    当您在移动模型后第一次运行 ma​​kemigrations 时, Django 迁移将创建迁移文件,删除旧应用程序中移动的模型并在新应用程序中重新创建它们。不要应用这些迁移,而是运行 migrate --fake,这会将迁移记录为已执行,而无需对数据库进行任何更改。之后,您的迁移文件和您的数据库结构将被同步。

    【讨论】:

    • 这里有点问题。将模型移动到新应用程序、修改这些模型并运行迁移是从旧应用程序中删除数据库表并在新应用程序中创建新表。为什么会发生这种情况?我们已经将新应用中的模型链接到旧的数据库表..
    • 运行 migrate --fake ,这会将迁移记录为已执行,而无需对数据库进行任何更改。之后,您的迁移文件和数据库结构将同步。我会更新回复。
    • 有时您无法伪造迁移(例如,CD 管道应用迁移和测试)。在这种情况下,请查看生成的迁移文件并删除不必要的步骤。但我更喜欢使用 RunPython 将数据迁移到新模型。
    猜你喜欢
    • 2012-07-14
    • 2019-05-17
    • 1970-01-01
    • 2010-11-18
    • 2013-10-16
    • 2011-12-22
    • 2011-12-14
    • 1970-01-01
    • 2015-11-05
    相关资源
    最近更新 更多