Django 迁移错误地应用

Django migrations wrongly applying

基本问题

我正在开发一个 Django 项目,在该项目中我使用带有自定义路由器的多个数据库。 因此,django 应该知道哪个应用程序使用哪个数据库。

现在我遇到了一些我认为很奇怪的行为,想问问是否有人知道这是否是正确的行为,特别是因为 github page 似乎没有问题跟踪器。

为了阐明这一点,我使用了一个极端的例子,我 none尽管如此尝试过。出于测试目的,我将 allow_migrate 函数设置为 return False.
我确实创建了一个覆盖 allow_migrate 函数的自定义路由器,并且我还在 DATABASE_ROUTERS 设置下注册了它。 allow_migrate 函数也被调用,因为我用一些 print 语句检查了它。

我是怎么理解路由器使用的

根据我对 using multiple databases with a custom router 文档的理解,allow_migration 方法指定是否要为当前 dbapp_labelmodel_name。 如果是 returns True,则应用迁移,如果 False,则为 'silently skipped',因此不应用。

如我所料

当我一直将 allow_migrate 函数设置为 return False 时,我预计 none 尚未应用的迁移会被应用。

实际发生了什么

如文档所述,迁移确实 'silently skipped',但是 table django_migrations none尽管如此,但仍充满了尚未应用的迁移。

为什么这是个问题

因此,如果我在 allow_migrate 函数中有实际逻辑,即使未正确应用迁移,例如由于数据库正在针对不应存储在该数据库中的特定应用程序进行测试,因此该数据库的 django_migrations table 正在填充 错误的 数据。

那么,这是想要的行为吗?我只是使用了函数 allow_migrate 错误,实际上应该使用其他东西吗?

如果相关,我正在使用 django version 3.1.2 并且我的数据库是 mariadb 数据库。

我有点明白所描述的问题到底是怎么回事了。

似乎对于 django 知道的每个数据库,它正在将使用 makemigrations 创建的迁移写入 django_migrations table,即使它没有实际应用迁移。 因此,它会跟踪每次新创建的迁移,并且只考虑未存储在 django_migrations table.

中的迁移

再说一遍:在每种情况下,无论是否应用迁移,都会将其写入django_migrations table。是否实际应用迁移仅由我提到的 allow_migrate 函数决定。但是,除了查看在该数据库中更改的 table 之外,没有任何线索表明是否实际应用了迁移。

我建议,django 要么在控制台中这样说,要么只在 django_migrations 中添加一个字段 applied。也许我会为此准备一个拉取请求。