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.
Спасибо за любую помощь.