Python Django多数据库连接

Python Django多数据库连接,python,django,database,postgresql,Python,Django,Database,Postgresql,我在我的设置中定义了两个数据库和路由器。py 'default': { }, 'primary': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': ... }, 'auth': { // similar to primary } DATABASE_ROUTERS = ['app.database_router.AuthRouter',

我在我的设置中定义了两个数据库和路由器。py

    'default': {
    },
    'primary': { 
         'ENGINE': 'django.db.backends.postgresql',
         'NAME': ...
    },
    'auth': {
         // similar to primary
    }

DATABASE_ROUTERS = ['app.database_router.AuthRouter','app.database_router.PrimaryReplicaRouter']
我遇到了一个问题,Django无法识别主数据库中的表/关系。我尝试重新排序AuthRouter和PrimaryRouter,但Django无法识别来自auth数据库的用户关系。有什么建议吗?我尝试将其中一个设置为默认设置,但这也无法解决问题

这是我的路由器,具有类似的身份验证类:

class PrimaryReplicaRouter:
    def db_for_read(self, model, **hints):
        """
        Reads go to a read replica. We can add 'read_replica', 'write_replica'
        """
        return 'primary'

    def db_for_write(self, model, **hints):
        """
        Writes always go to primary.
        """
        return 'primary'

    def allow_relation(self, obj1, obj2, **hints):
        """
        Relations between objects are allowed if both objects are
        in the primary/replica pool.
        """
        return True

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        """
        All non-auth models end up in this pool.
        """
        return True

class Auth:
     def db_for_read(self, model, **hints):
        return 'auth'

    def db_for_write(self, model, **hints):
        return 'auth'

    def allow_relation(self, obj1, obj2, **hints):
        """
        Allow relations if a model in the auth app is involved.
        """
        return True

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        """
        Make sure the auth app only appears in the 'auth'
        database.
        """
        return True

这只是根据我的经验推测,但我相信你的问题在于你的文件。更改导致更改效果的顺序是完全正常的,因为Django尝试按照路由器在列表中的顺序使用路由器按顺序解析请求。这两个路由器中的错误可能相似,因为似乎顺序中的第一个路由器阻止了第二个路由器的正确执行


祝你好运,希望这有点帮助

这只是根据我的经验推测,但我相信你的问题在于你的文件。更改导致更改效果的顺序是完全正常的,因为Django尝试按照路由器在列表中的顺序使用路由器按顺序解析请求。这两个路由器中的错误可能相似,因为似乎顺序中的第一个路由器阻止了第二个路由器的正确执行


祝你好运,希望这有点帮助

调查类似情况的一种方法是在代码中放入一些打印语句,看看
模型是什么。_meta.app_label
值。找出这些问题后,只需将请求代理到
routers.py
文件中的正确数据库:

class AuthRouter:
    def db_for_read(self, model, **hints):
        if model._meta.app_label in ['auth', 'django', 'sessions', 'admin']:
            return 'auth_db_name'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label in ['auth', 'django', 'sessions', 'admin']:
            return 'auth_db_name'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        return True

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label == 'auth_db_name':
            return False
        return True

class ApplicationRouter:
    def db_for_read(self, model, **hints):
        return 'app_db_name'

    def db_for_write(self, model, **hints):
        return 'app_db_name'

    def allow_relation(self, obj1, obj2, **hints):
        if obj1._state.db == 'app_db_name' and obj2._state.db == 'app_db_name':
            return True
        return False

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return True
确保您的
settings.py
文件已通过
数据库
配置正确配置了两个数据库,并且
数据库路由器
配置也已正确设置(注意

DATABASE_ROUTERS = ['routers.AuthRouter', 'routers.ApplicationRouter']

参考资料:

调查类似情况的一种方法是在代码中放入一些打印语句,看看
模型的值是什么。\u meta.app\u label
值。在找出这些值后,只需将请求代理到
routers.py
文件中的正确数据库:

class AuthRouter:
    def db_for_read(self, model, **hints):
        if model._meta.app_label in ['auth', 'django', 'sessions', 'admin']:
            return 'auth_db_name'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label in ['auth', 'django', 'sessions', 'admin']:
            return 'auth_db_name'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        return True

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label == 'auth_db_name':
            return False
        return True

class ApplicationRouter:
    def db_for_read(self, model, **hints):
        return 'app_db_name'

    def db_for_write(self, model, **hints):
        return 'app_db_name'

    def allow_relation(self, obj1, obj2, **hints):
        if obj1._state.db == 'app_db_name' and obj2._state.db == 'app_db_name':
            return True
        return False

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return True
确保您的
settings.py
文件已通过
数据库
配置正确配置了两个数据库,并且
数据库路由器
配置也已正确设置(注意

DATABASE_ROUTERS = ['routers.AuthRouter', 'routers.ApplicationRouter']

参考:

我也添加了路由器文件。@CR Python如果发现路由器有问题请告诉我?我也添加了路由器文件。@CR Python如果发现路由器有问题请告诉我?