Python Django多数据库连接
我在我的设置中定义了两个数据库和路由器。pyPython 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',
'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如果发现路由器有问题请告诉我?