Django db_router 没有按预期排除应用模型

Django db_router does not exclude app models as expected

我正在尝试创建一个应用程序,其中一台服务器与许多其他工作服务器进行通信。这些服务器每个都有自己的数据库,其中应该只包含自己模型的表。我创建了一个数据库路由器,不幸的是它不起作用,因为 migrate 命令继续在数据库中创建 auth、contenttypes 和几乎所有 Django 应用程序模型,根据路由器,应该包含 none 并且只包含工作服务器具体型号。

预计在数据库中:

数据库中实际生成:

设置中的代码:

    DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'server_1_db',
        'USER': 'postgres',
        'PASSWORD': 'admin',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

DATABASE_ROUTERS = ['ApplicationServer_2.db_routers.RestRouter']

路由器代码:

class RestRouter:

app_labels = {"DoNOTadd", "auth", "admin", "sessions", "contenttypes"}

def db_for_read(self, model, **hints):

    if model._meta.app_label not in self.app_labels:
        return 'default'
    return "For read db"

def db_for_write(self, model, **hints):

    if model._meta.app_label not in self.app_labels:
        return "default"
    return "For write db"

def allow_relation(self, obj1, obj2, **hints):

    if (
        obj1._meta.app_label not in self.app_labels or
        obj2._meta.app_label not in self.app_labels
    ):
       return True
    return None

def allow_migrate(self, db, app_label, model_name=None, **hints):
    if app_label not in self.app_labels:
        print(app_label)
        return db == "default"
    return None

我做错了什么? 在 allow migrate 中,只打印了预期的 app_label,这意味着不应迁移 auth、admin 等,但它们会被迁移 nonetheless?

您的 allow_migrate 应该 return False 以表明 app_labels 以外的应用程序不允许在此数据库中迁移:

def allow_migrate(self, db, app_label, model_name=None, **hints):
    if app_label not in self.app_labels:
        return db == "default"
    return False

像您一样返回 None 意味着此路由器不关心此迁移。 From the docs 对于 allow_migrate:

Determine if the migration operation is allowed to run on the database with alias db. Return True if the operation should run, False if it shouldn’t run, or None if the router has no opinion.