将多个模型从一个 django 应用程序移动到另一个

rva*_*aga 5 django django-models

我正在使用 django v2.0.2 构建一个项目,该项目由 3 个具有 24 个模型的应用程序组成。其中一款应用有 14 个模型。在一个应用程序中拥有如此多的模型变得越来越复杂,我想创建一个新应用程序并将少数模型移至此应用程序。

我找到了一个答案,解释了如何使用南来做到这一点。我一直在使用 django 核心迁移,由于不推荐使用南,此时我不想切换到南。

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

Ado*_*isN 5

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

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

所以,如果你有一个帖子在模型博客的应用程序,是的自动生成的表名邮政模型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'
Run Code Online (Sandbox Code Playgroud)

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

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

  • 有时您不能伪造迁移(例如应用迁移和测试的 CD 管道)。在这种情况下,请查看生成的迁移文件并删除不必要的步骤。但我更喜欢使用 RunPython 将数据迁移到新模型。 (2认同)