How to use DB router in Django 1.4

前端 未结 2 1385
遇见更好的自我
遇见更好的自我 2021-01-19 22:01

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

相关标签:
2条回答
  • 2021-01-19 22:58

    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.

    0 讨论(0)
  • 2021-01-19 22:59

    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.

    0 讨论(0)
提交回复
热议问题