Djangoで複数のデータベースを使う際に、データベースルーター(Database router)を設定すると、モデル毎にデータベースを切り替えたりできます。
Multiple databases | Django documentation | Django
データベースルーターが設定されている場合に、アプリケーション側で任意のモデルがどのデータベースを使うのかを取得するには、django.db.routerを使います。
試したバージョンは、Python3.5、Django1.9。
コード
myapp/models.py
from django.db import models class Item(models.Model): name = models.CharField(max_length=20)
myproject/router.py
myappという名前のアプリケーションの場合はspamdbを使うルールのデータベースルーター。
class MyAppRouter: def db_for_read(self, model, **hints): if model._meta.app_label == 'myapp': return 'spamdb' def db_for_write(self, model, **hints): if model._meta.app_label == 'myapp': return 'spamdb' def allow_relation(self, obj1, obj2, **hints): if obj1._meta.app_label == 'myapp' or \ obj2._meta.app_label == 'myapp': return True def allow_migrate(self, db, app_label, model=None, **hints): if app_label == 'myapp': return db == 'spamdb'
myproject/settings.py(抜粋)
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }, 'spamdb': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'spamdb.sqlite3'), } } DATABASE_ROUTERS = ['myproject.router.MyAppRouter']
django.db.routerを使って、データベース名を取得してみる
django.dbモジュールのrouter変数は、django.db.utils.ConnectionRouterクラスのインスタンスです。
>>> from django.db import router >>> from myapp.models import Item >>> router.db_for_read(Item) 'spamdb' >>> router.db_for_write(Item) 'spamdb' >>> from django.contrib.auth.models import User >>> router.db_for_read(User) 'default' >>> router.db_for_write(User) 'default'
モデルから、使用するデータベース名を取得できました。
ちなみに、Manager.db_managerによって取得したMangerインスタンスの場合は、dbプロパティにてアクセスできます。
>>> User.objects.db_manager('spamdb').db 'spamdb'