django中使用多个数据库,跨库查询
一、settings配置多个数据库
DATABASES = { 'default': { # 'ENGINE': 'django.db.backends.mysql', 'ENGINE': 'common_framework.utils.mysql', 'NAME': 'choice', 'USER': 'ad_user', 'PASSWORD': 'ad_pass', 'HOST': '127.0.0.1', 'PORT': '3306', 'SIZE': '10', }, 'platform': { # 'ENGINE': 'django.db.backends.mysql', 'ENGINE': 'common_framework.utils.mysql', 'NAME': 'test', 'USER': 'ad_user', 'PASSWORD': 'ad_pass', 'HOST': '192.168.10.179', 'PORT': '3306', 'SIZE': '10', } }
二、数据库路由
在settings目录同级下新建一个database_router.py文件
# -*- coding: utf-8 -*- from django.conf import settings from event.models import Event DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING class DataBaseAppsRouter(object): def db_for_read(self, model, **hints): """"Point all read operations to the specific database.""" if model._meta.app_label in DATABASE_MAPPING: if model == Event: return "default" else: return DATABASE_MAPPING[model._meta.app_label] return None def db_for_write(self, model, **hints): """Point all write operations to the specific database.""" if model._meta.app_label in DATABASE_MAPPING: return DATABASE_MAPPING[model._meta.app_label] return None # def allow_relation(self, obj1, obj2, **hints): # """Allow any relation between apps that use the same database.""" # db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label) # db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label) # if db_obj1 and db_obj2: # if db_obj1 == db_obj2: # return True # else: # return False # return None
三、跨表查询(using方法)
EventUserAnswer.objects.using("platform").filter(user=user, team=request.user.team, status=1).first():