【发布时间】:2014-03-28 16:33:10
【问题描述】:
我创建了一个 django 项目,然后创建了两个应用,app1 和 app2。我希望两个应用程序共享一个 mysql 数据库('nameofDB' 到 mysql,'mydb' 到 django)。我在 settings.py 中将数据库添加到 DATABASES,并为每个应用程序创建了一个 dbrouter 文件,并将每个路由器添加到 DATABASE_ROUTERS。同样在 settings.py 中将每个应用程序添加到 INSTALLED_APPS。
我的问题是当我尝试制作时
python manage.py syncdb --database=mydb
因为它不会同步两个应用程序(仅 app1)。它说:
Creating tables ...
Creating table app1_model1
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
这里是我的 settings.py:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app1',
'app2',
)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'mydb':{
'ENGINE': 'django.db.backends.mysql',
'NAME': 'nameofDB',
'USER':'username',
'PASSWORD':'password',
}
}
DATABASE_ROUTERS = ['app1.dbRouter.App1DBRouter', 'app2.dbRouter.App2DBRouter']
这是我的模型:
app1/models.py:
class Model1(models.Model):
name = models.CharField(max_length=100)
app2/models.py:
class Model2(models.Model):
name = models.CharField(max_length=100)
这是我的数据库路由器
app1/dbRouter.py
class App1DBRouter(object):
def db_for_read(self,model, **hints):
if model._meta.app_label == 'app1':
return 'mydb'
return None
def db_for_write(self,model, **hints):
if model._meta.app_label == 'app1':
return 'mydb'
return None
def allow_relation(self,obj1, obj2, **hints):
if obj1._meta.app_label == 'app1' and \
obj2._meta.app_label == 'app1':
return True
return None
def allow_syncdb(self,db, model):
if db == 'mydb':
return model._meta.app_label == 'app1'
elif model._meta.app_label == 'app1':
return False
return None
app2/dbRouter.py
class App2DBRouter(object):
def db_for_read(self,model, **hints):
if model._meta.app_label == 'app2':
return 'mydb'
return None
def db_for_write(self,model, **hints):
if model._meta.app_label == 'app2':
return 'mydb'
return None
def allow_relation(self,obj1, obj2, **hints):
if obj1._meta.app_label == 'app2' and \
obj2._meta.app_label == 'app2':
return True
return None
def allow_syncdb(self,db, model):
if db == 'mydb':
return model._meta.app_label == 'app2'
elif model._meta.app_label == 'app2':
return False
return None
它有什么问题?我该怎么办?提前致谢! :)
【问题讨论】:
-
allow_syncdb() 方法应在 db==default 和 model._meta.app_label==myapp 的条件下返回 False。尝试阅读stackoverflow.com/questions/7360774/…的答案
-
你确定这里需要两个数据库吗?在应用程序之间共享数据库是正常的普通行为,不需要路由器。
标签: mysql django django-models django-database