我试图创建一个多数据库,我做到了。我在setting.py上写了这样的代码:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'baseDB',
'USER': 'admin',
'PASSWORD': 'admin',
'HOST': '127.0.0.1',
'PORT': '1234',
},
'android': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'androidDB',
'USER': 'admin',
'PASSWORD': 'admin',
'HOST': '127.0.0.1',
'PORT': '1234',
},
'ios': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'iosDB',
'USER': 'admin',
'PASSWORD': 'admin',
'HOST': '127.0.0.1',
'PORT': '1234',
}
}
而且我已经创建了两个models.py,例如:
class AndroidModel(models.Model):
name = models.CharField(default=False)
version = models.CharField()
class Meta:
app_label = 'android_label'
class IosModel(models.Model):
name = models.CharField(default=False)
version = models.CharField()
class Meta:
app_label = 'ios_label'
然后我创建了一个名为 dbrouters 的路由,类是 MyDBRouter,代码如下:
from api.models import AndroidModel, IosModel
class MyDBRouter(object):
def db_for_read(self, model, **hints):
if model._meta.app_label == 'android_label':
return 'android'
if UserJembatani._meta.app_label == 'ios':
return 'ios'
else:
return 'default'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label == 'android_label':
return 'android'
if UserJembatani._meta.app_label == 'ios_label':
return 'ios'
else:
return 'default'
return None
def allow_relation(self, obj1, obj2, **hints):
if obj1._meta.app_label == 'android_label' or \
obj2._meta.app_label == 'android_label':
return True
if obj1._meta.app_label == 'ios_label' or \
obj2._meta.app_label == 'ios_label':
return True
else:
return 'default'
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
if not UserJembatani._meta.app_label == 'android_label':
return'android' == db
if not UserJembatani._meta.app_label == 'ios_label':
return'ios' == db
else:
return 'default' == db
return None
而且我将 DATABASE_ROUTERS 放在 setting.py 中:
DATABASE_ROUTERS = ('app_mobile.dbrouters.MyDBRouter',)
在那之后,我决定使用命令行迁移它:
python manage.py migrate --database=android
和
python manage.py migrate --database=android
但是问题。当我尝试执行该命令时,它们两个模型总是创建到两个数据库中。目标是,我希望模型 android 只是在 android 数据库中创建为一个表,并且对于 ios 模型也喜欢相同的条件。
答案 0 :(得分:0)
您可以尝试类似的方法(有关详细信息,请参阅 https://www.webforefront.com/django/modelmultidatabases.html)
def allow_migrate(self, db, app_label, model_name=None, **hints):
if db == 'ios':
if app_label in ['auth','admin','ios']:
return True
elif app_label=='android':
return False
elif db == 'android':
if app_label in ['auth','admin','android']:
return True
elif app_label=='ios':
return False
return None