Django db_router 没有按预期排除应用模型
Django db_router does not exclude app models as expected
我正在尝试创建一个应用程序,其中一台服务器与许多其他工作服务器进行通信。这些服务器每个都有自己的数据库,其中应该只包含自己模型的表。我创建了一个数据库路由器,不幸的是它不起作用,因为 migrate 命令继续在数据库中创建 auth、contenttypes 和几乎所有 Django 应用程序模型,根据路由器,应该包含 none 并且只包含工作服务器具体型号。
预计在数据库中:
- 工作服务器模型 1
数据库中实际生成:
- 工作服务器模型 1
- auth_group
- auth_group_权限
- auth_permission
- auth_user
- auth_user_组
- 其余所有 django 模型
设置中的代码:
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.
我正在尝试创建一个应用程序,其中一台服务器与许多其他工作服务器进行通信。这些服务器每个都有自己的数据库,其中应该只包含自己模型的表。我创建了一个数据库路由器,不幸的是它不起作用,因为 migrate 命令继续在数据库中创建 auth、contenttypes 和几乎所有 Django 应用程序模型,根据路由器,应该包含 none 并且只包含工作服务器具体型号。
预计在数据库中:
- 工作服务器模型 1
数据库中实际生成:
- 工作服务器模型 1
- auth_group
- auth_group_权限
- auth_permission
- auth_user
- auth_user_组
- 其余所有 django 模型
设置中的代码:
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.