I\'ve been trying to setup Django 1.4.3 to use multiple DBs, but for the life of me I can\'t make it to work. I read the documentation and posts on SO, and did the following
I found out that the statement in step 3 "from django.db import connections
" was preventing the DB router to be registered. When I removed this statement, the router was registered and stuff started to work as expected.
I think the problem is probably arising because your routers.py
only returns a reference to 'db1'
but as you say you're only being routed to 'default'
I'm unsure (I would expect it to be the only routed to 'db1'
.
In routers.py
create a master router class, and then subclass for each DB - and initialise with an app_label
string so you can set them apart.
class MasterRouter(object):
def __init__(self, app_label):
super(MasterRouter, self).__init__()
self.app_label = app_label
def db_for_read(self, model, **hints):
if model._meta.app_label == self.app_label:
return self.app_label
return None
def db_for_write(self, model, **hints):
if model._meta.app_label == self.app_label:
return self.app_label
return None
def allow_relation(self, obj1, obj2, **hints):
if obj1._meta.app_label == self.app_label or obj2._meta.app_label == self.app_label:
return True
return None
def allow_syncdb(self, db, model):
if db == 'default':
return model._meta.app_label == self.app_label
elif model._meta.app_label == self.app_label:
return False
return None
class DefaultRouter(MasterRouter):
def __init__(self):
super(DefaultRouter, self).__init__('default')
class DB1Router(MasterRouter):
def __init__(self):
super(DB1Router, self).__init__('db1')
and then in your settings.py
declare the routers
DATABASE_ROUTERS = [ 'routers.DefaultRouter', 'routers.DB1Router' ]
ofcourse, you'll probably want to set up your MasterRouter
class overrides differently.