Я искал все решения для этого, но не смог найти что-либо.Несколько баз данных Django - модель карты для базы данных в одном приложении
У меня есть один проект Django, одно приложение, две модели и две базы данных. Я хотел бы, чтобы одна модель говорила и синхронизировалась исключительно с одной базой данных. Это то, что я пробовал:
Настройки
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'database_a', # Or path to database file if using sqlite3.
# The following settings are not used with sqlite3:
'USER': 'user',
'PASSWORD': 'xxxxxx',
'HOST': 'localhost', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
'PORT': '', # Set to empty string for default.
},
'applicationb_db': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'database_b',
'USER': 'user',
'PASSWORD': 'xxxxxx',
'HOST': 'localhost',
'PORT': '',
},
}
DATABASE_ROUTERS = ['fanmode4.router.ApiRouter']
Модели
from django.db import models
class TestModelA(models.Model):
testid = models.CharField(max_length=200)
class Meta:
db_table = 'test_model_a'
class TestModelB(models.Model):
testid = models.CharField(max_length=200)
class Meta:
db_table = 'test_model_b'
app_label = 'application_b'
маршрутизатор
class ApiRouter(object):
def db_for_read(self, model, **hints):
if model._meta.app_label == 'application_b':
return 'applicationb_db'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label == 'application_b':
return 'applicationb_db'
return None
def allow_relation(self, obj1, obj2, **hints):
if obj1._meta.app_label == 'application_b' or \
obj2._meta.app_label == 'application_b':
return True
return None
def allow_syncdb(self, db, model):
if db == 'applicationb_db':
return model._meta.app_label == 'application_b'
elif model._meta.app_label == 'application_b':
return False
return None
имя приложения «api». В основном с этой настройкой, если я синхронизирую базу данных, она будет синхронизироваться только по умолчанию db. Если я синхронизирую базу данных с указанием второй базы данных python manage.py syncdb --database=applicationb_db
, она ничего не синхронизирует со второй базой данных.
Я просто пытаюсь добиться следующего:
- Все для TestModelA идет по умолчанию в базе данных
- Все для TestModelB идет в applicationb_db БД При
- Все остальное идет в базу данных по умолчанию
Привет @Rohan спасибо, что нашли время, чтобы ответить. Когда я попробовал свой ответ, я получаю «NameError: глобальное имя« TestModelB »не определено». Если я попытаюсь поместить имя модели в одинарные кавычки, она просто ничего не синхронизирует. –
@MarkWinterbottom, добавьте 'из моделей import TestModelB' в код. – Rohan
Привет, Рохан, спасибо за вашу помощь. Я не думаю, что вы можете импортировать модели в класс маршрутизатора, потому что я получаю сообщение об ошибке «django.core.exceptions.ImproperlyConfigured: Ошибка импорта маршрутизатора базы данных ApiRouter:« Без модуля с именем модели »« –