Django путает одинаковые имена БД, запущенные на разных портах

Я запускаю две разные MongoDB на разных портах и настроил DB router для поиска нужной базы данных.

Кроме того, имя БД и таблицы одинаковы в обоих случаях.

Предположим, что у меня есть 2 приложения first_app и second_app, где БД connection names также одинаковы.

settings.py

...
    'first_app': {
        'ENGINE': 'djongo',
        'NAME': os.environ.get("FIRST_DB_DATABASE", 'mymongodb'),
        'CLIENT': {
            'host': os.environ.get("FIRST_DB_HOST", "localhost"),
            'port': 27019,
            'username':  os.environ.get("FIRST_DB_USER"),
            'password':  os.environ.get("FIRST_DB_PASSWORD"),
        }
    },
    'second_app': {
        'ENGINE': 'djongo',
        'NAME': os.environ.get("SECOND_DB_DATABASE", 'mymongodb'),
        'CLIENT': {
            'host': os.environ.get("SECOND_DB_HOST", "localhost"),
            'port': 27020,
            'username':  os.environ.get("SECOND_DB_USER"),
            'password':  os.environ.get("SECOND_DB_PASSWORD"),
        }
    },
...

и вот причина, почему имена приложений одинаковы connection names, чтобы найти подходящую БД в маршрутизаторе на основе имени приложения:

db_router.py

class MultiDatabaseRouter:
    app_labels = {'first_app', 'second_app'}
    mongodb_app_labels = {'first_app', 'second_app'}

    def db_for_read(self, model, **hints):
        if model._meta.app_label in self.app_labels:
            return model._meta.app_label
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label in self.app_labels:
            return model._meta.app_label
        return None

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

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        """Do not migrate MongoDB."""
        if app_label in self.mongodb_app_labels:
            return False
        return None

Кроме того, у меня одни и те же модели в обоих приложениях, использующих один и тот же db_table.

Но, когда я получаю данные в Django admin, результат всегда приходит из первой настроенной БД, которая является first_app. Если я изменю порядок конфигурации в setting.py, то данные будут принадлежать second_app.

В результате Django также выдает мне предупреждение, как показано ниже:

product: (models.W035) db_table 'product' is used by multiple models: first_app.Product, second_app.Product.
        HINT: You have configured settings.DATABASE_ROUTERS. Verify that first_app.Product, second_app.Product are correctly routed to separate databases.

Спасибо за любую помощь.

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