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