Python 多个Django数据库-将模型映射到同一应用程序中的数据库
我已经到处寻找这个问题的解决方案,但一直找不到任何东西 我有一个Django项目、一个应用程序、两个模型和两个数据库。我想一个模型发言,并同步到一个数据库独家。这就是我尝试过的: 设置Python 多个Django数据库-将模型映射到同一应用程序中的数据库,python,database,django,django-models,django-database,Python,Database,Django,Django Models,Django Database,我已经到处寻找这个问题的解决方案,但一直找不到任何东西 我有一个Django项目、一个应用程序、两个模型和两个数据库。我想一个模型发言,并同步到一个数据库独家。这就是我尝试过的: 设置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 'NAME': 'da
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'database_a', # Or path to database file if using sqlite3.
# The following settings are not used with sqlite3:
'USER': 'user',
'PASSWORD': 'xxxxxx',
'HOST': 'localhost', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
'PORT': '', # Set to empty string for default.
},
'applicationb_db': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'database_b',
'USER': 'user',
'PASSWORD': 'xxxxxx',
'HOST': 'localhost',
'PORT': '',
},
}
DATABASE_ROUTERS = ['fanmode4.router.ApiRouter']
from django.db import models
class TestModelA(models.Model):
testid = models.CharField(max_length=200)
class Meta:
db_table = 'test_model_a'
class TestModelB(models.Model):
testid = models.CharField(max_length=200)
class Meta:
db_table = 'test_model_b'
app_label = 'application_b'
型号
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'database_a', # Or path to database file if using sqlite3.
# The following settings are not used with sqlite3:
'USER': 'user',
'PASSWORD': 'xxxxxx',
'HOST': 'localhost', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
'PORT': '', # Set to empty string for default.
},
'applicationb_db': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'database_b',
'USER': 'user',
'PASSWORD': 'xxxxxx',
'HOST': 'localhost',
'PORT': '',
},
}
DATABASE_ROUTERS = ['fanmode4.router.ApiRouter']
from django.db import models
class TestModelA(models.Model):
testid = models.CharField(max_length=200)
class Meta:
db_table = 'test_model_a'
class TestModelB(models.Model):
testid = models.CharField(max_length=200)
class Meta:
db_table = 'test_model_b'
app_label = 'application_b'
路由器
class ApiRouter(object):
def db_for_read(self, model, **hints):
if model._meta.app_label == 'application_b':
return 'applicationb_db'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label == 'application_b':
return 'applicationb_db'
return None
def allow_relation(self, obj1, obj2, **hints):
if obj1._meta.app_label == 'application_b' or \
obj2._meta.app_label == 'application_b':
return True
return None
def allow_syncdb(self, db, model):
if db == 'applicationb_db':
return model._meta.app_label == 'application_b'
elif model._meta.app_label == 'application_b':
return False
return None
应用程序名为“api”。基本上,通过这种设置,如果我同步数据库,它将只在默认数据库上同步。如果我通过指定第二个数据库来同步数据库python manage.py syncdb--database=applicationb_db
,它将不会将任何内容同步到第二个数据库
我只是想实现以下目标:
- TestModelA的所有内容都将转到默认数据库
- TestModelB的所有内容都转到applicationb_db数据库
- 其他所有内容都将进入默认数据库
模型。\u meta.app\u label
您可以使用模型
检查它是哪种模型,并返回相应的数据库
您可以将路由器更新为:
class ApiRouter(object):
def db_for_read(self, model, **hints):
if model == TestModelB:
return 'applicationb_db'
return None
def db_for_write(self, model, **hints):
if model == TestModelB:
return 'applicationb_db'
return None
def allow_relation(self, obj1, obj2, **hints):
if model == TestModelB:
return True
return None
def allow_syncdb(self, db, model):
if model == TestModelB:
return True
else:
return False
return None
嗨@Rohan谢谢你花时间回答。当我尝试您的答案时,我得到“NameError:未定义全局名称'TestModelB'。如果我尝试将模型名称用单引号括起来,它就不会同步任何内容。@MarkWinterbottom,在代码中添加来自模型导入TestModelB的
。嗨,Rohan,谢谢你的帮助。我认为您不能将模型导入router类,因为我得到错误“django.core.exceptions.impropertlyconfigured:导入数据库路由器ApiRouter时出错:“没有名为models的模块”“@MarkWinterbottom”,或者您可以将路由器代码中的测试条件更改为if model.\uu name\uu=='TestModelB'
。