我正在使用django v2.0.2构建一个项目,该项目包含3个24个模型的应用程序。其中一个应用程序有14个型号。在一个应用程序中拥有如此多的模型变得越来越复杂,我想创建一个新的应用程序并将少数模型移动到这个应用程序。
我发现an answer解释了如何使用南方进行此操作。我一直在使用django核心迁移,因为南方已被弃用,我现在不想转向南方。
我想要移动的模型非常复杂 - 它们有ForeignKey
个字段,ManyToMany
字段等。我需要一个工作流程来展示如何使用django核心迁移来移动这些模型。
答案 0 :(得分:4)
这应该不会太难。您遇到的主要问题是Django automatically derives来自模型类名称的数据库表的名称以及包含它的应用程序。
这意味着除非您在模型元中明确设置 db_table 属性,否则将根据应用/型号名称组合自动生成与模型对应的所有表的名称。
因此,如果您在博客应用中拥有发布模型,则发布模型的自动生成的表名称为 blog_post 即可。如果您决定将发布模型移至文章应用,则Django将会查找名为 article_post 的表格,但无法将您的模型与正确的表相关联。
要解决此问题,您需要在每个模型上显式设置 db_table 属性。 db_table 名称值必须与当前的app / model组合对应。因此,对于上面提到的发布模型,您可以将 db_table 设置为 blog_post 。设置 db_table 属性后,您可以将模型移动到任何其他应用程序。
class Post(models.Model):
title = models.CharField(max_length=120)
class Meta:
db_table = 'blog_post'
移动所有模型后,请登录django admin以验证您的数据是否仍可通过新移动的模型访问。
移动模型后第一次运行 makemigrations 时, Django迁移将创建迁移文件,删除旧应用中移动的模型,并在新应用中重新创建它们。不要应用这些迁移,而是运行 migrate --fake ,这会将迁移记录为已执行而不进行任何数据库更改。之后,您的迁移文件和数据库结构将同步。