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, если маршрутизатор не имеет мнения.

Вернуться на верх