読者です 読者をやめる 読者になる 読者になる

Djangoで複数のデータベースを使う際に、モデルごとに使われるデータベース名を取得する

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'