“为什么是Django?”;“迁移”;报告已从迁移中跳过的应用是否正常?

“为什么是Django?”;“迁移”;报告已从迁移中跳过的应用是否正常?,django,migration,Django,Migration,我创建了自定义数据库路由器,并在settings.py中正确配置了它(以及数据库别名)。路由器定义了allow_migrate()方法,该方法显式跳过(返回False)不需要的应用程序。基本上,有两个关键要求: 仅允许对给定的“所需”应用程序集进行迁移 对于那些“想要的”应用程序,只允许在特定数据库中进行迁移 我有非常详细的单元测试脚本,它验证了所有可能的测试用例,并证明了一切都是按它应该的方式“路由”的。我包括了debug print语句,这些语句在允许迁移时打印消息(返回True),当我应用

我创建了自定义数据库路由器,并在settings.py中正确配置了它(以及数据库别名)。路由器定义了allow_migrate()方法,该方法显式跳过(返回False)不需要的应用程序。基本上,有两个关键要求:

  • 仅允许对给定的“所需”应用程序集进行迁移
  • 对于那些“想要的”应用程序,只允许在特定数据库中进行迁移
  • 我有非常详细的单元测试脚本,它验证了所有可能的测试用例,并证明了一切都是按它应该的方式“路由”的。我包括了debug print语句,这些语句在允许迁移时打印消息(返回True),当我应用迁移时(运行“迁移”),其中包括“需要的”和“不需要的”应用程序-它只为正确的迁移生成标准输出(表示允许对这样或那样的应用程序进行迁移)

    但是。。。输出还包括所有rest应用的“Applying…OK”(对于这些应用,allow_migrate()返回False)。在数据库中,我看到迁移仅应用于所需的应用程序,但“迁移”表列出了所有迁移(应用的和未应用的)

    为什么“migrations”表获取尚未真正应用的迁移记录(并且标准输出显示OK)


    我遗漏了什么?如果allow_migrate()返回False,我如何避免迁移被视为已应用?

    我不知道为什么迁移系统是这样设计的,但我同意您的观点,这种行为是不可取的


    这是一个很好的解决方案(具体请参见我的评论),但不幸的是,目前还没有解决方案,我也不知道有什么好的解决方案。

    这正是它所描述的方式

    makemigrations始终为模型更改创建迁移,但如果 allow_migrate()返回False,对 在数据库上运行迁移时,将自动跳过模型名称

    不幸的是,在我看来,allow_migrate的实现并没有真正考虑到很多用例,因为它并没有阻止迁移的运行,这会填充迁移历史


    allow_migrate check位于每个迁移操作中,并不意味着不允许完全迁移(可能是因为迁移依赖关系历史或其他原因)

    例如,postgres数据库转发操作类的方法

    对于您自己的用例,您需要编写自己的解决方案,并在这之前进行allow_migrate检查(查看管理命令并从那里开始)

    def database_forwards(self, app_label, schema_editor, from_state, to_state):
        if (
            schema_editor.connection.vendor != 'postgresql' or
            not router.allow_migrate(schema_editor.connection.alias, app_label)
        ):
            return