Article.objects.using('smapdb').filter(条件...)
というように、 using() をつけると指定のデーターベースへの QuerySet が取得できる。
モデル毎にアクセスするデータベースを切り替えたいというときには、データーベースルーターというのを使えいいらしいというのは聞いていたが、必要になって調べてみると、(また)tokibito さんが以前書いていた。ありがたやありがたや。
https://tokibito.hatenablog.com/entry/20160202/1454344534
ただ、試してみるとコードがちょっとおかしい。
allow_relation() と allow_migrate() で、myapp でないときの処理が足りないようだ。
また、 db_for_read() と db_for_write() は間違ってはいないけど、 if 文の条件に合わない場合に None をかえしているのがわかりにくい
MyAppRouter を以下のようにしたら、意図した結果になった。
class MyAppRouter:
def db_for_read(self, model, **hints):
if model._meta.app_label == 'myapp':
return 'smapdb'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label == 'myapp':
return 'spamdb'
return None
def allow_relation(self, obj1, obj2, **hints):
if (obj1._meta.app_label == 'myapp' and
obj2._meta.app_label == 'myapp'):
return True
elif (obj1._meta.app_label != 'myapp' or
obj2._meta.app_label != 'myapp'):
return True
return False
def allow_migrate(self, db, app_label, model=None, **hints):
if app_label == 'myapp':
return db == 'smapdb'
else:
return db != 'smapdb'
この記事へのコメント