一个数据库对一个app
setting.py 配置文件
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": os.path.join(BASE_DIR, "db.sqlite3"),
},
"db1": {
"ENGINE": "django.db.backends.mysql",
"NAME": "django_advanced",
"HOST": "127.0.0.1",
"PORT": "3306",
"USER": "root",
"PASSWORD": "root",
}
配置数据库路由 setting.py
DATABASES_APPS_MAPPING = {
"polls": "default",
"polls2": "db1",
}
DATABASE_ROUTERS = ["my_blog.database_app_router.DatabaseAppsRouter"]
# my_blog 路由文件目录
编写路由文件 database_app_router.py
from django.conf import settings
class DatabaseAppsRouter(object):
def db_for_read(self, model, **hints):
app_label = model._meta.app_label
if app_label in settings.DATABASES_APPS_MAPPING:
res = settings.DATABASES_APPS_MAPPING[app_label]
print(res)
return res
return None
def db_for_write(self, model, **hints):
app_label = model._meta.app_label
if app_label in settings.DATABASES_APPS_MAPPING:
return settings.DATABASES_APPS_MAPPING[app_label]
return None
def allow_relation(self, obj1, obj2, **hints):
# 获取对应数据库的名字
db_obj1 = settings.DATABASES_APPS_MAPPING.get(obj1._mata.app_label)
db_obj2 = settings.DATABASES_APPS_MAPPING.get(obj2._mata.app_label)
if db_obj1 and db_obj2:
if db_obj1 == db_obj2:
return True
else:
return False
return None
def db_for_migrate(self, db, app_label, model_name=None, **hints):
if db in settings.DATABASES_APPS_MAPPING.values():
return settings.DATABASES_APPS_MAPPING.get(app_label) == db
elif app_label in settings.DATABASES_APPS_MAPPING:
return False
return None
新建app python manage.py startapp polls2
注册setting
INSTALLED_APPS = [
"polls2",
]
添加模版OK
同一个app下使用不同的数据库
上面配置是一样的
models.py 编写
class Book2(models.Model):
author = models.CharField(max_length=1024, blank=True, null=True)
title = models.CharField(max_length=1024)
class Meta:
app_label = "polls2" # app_label 指定数据库
db_table = "week_company_data" # db_table 指定表名