Django db_router не исключает модели приложений, как ожидалось
Я пытаюсь создать приложение, в котором один сервер взаимодействует с множеством других рабочих серверов. Каждый из этих серверов будет иметь свою собственную БД, которая должна содержать только таблицы для их собственных моделей. Я создал маршрутизатор базы данных, который, к сожалению, не работает, так как команда migrate продолжает создавать auth, contenttypes и практически все модели приложения Django в базе данных, которая, согласно маршрутизатору, не должна содержать ничего из этого и только модели, специфичные для рабочих серверов
Ожидается в базе данных:
- Модель сервера 1
Фактически произведено в базе данных:
- Модель 1 рабочего сервера
- auth_group
- auth_group_permissions
- auth_permission
- auth_user
- auth_user_groups
- все остальные модели 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 и т.д. не должны быть перенесены, но они все равно перенесены?
Ваш allow_migrate должен вернуть 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, как вы делаете, означает, что этот маршрутизатор не заботится об этой миграции. Из документации для allow_migrate:
Определите, разрешена ли операция миграции для базы данных с псевдонимом db. Возвращает True, если операция должна выполняться, False, если она не должна выполняться, или None, если маршрутизатор не имеет мнения.