我正在尝试在我的Django项目中使用多个数据库。
如您所见,我正在尝试使用custom
数据库而不是default
。在其他函数中,从`objects.using ='database'。
只有在尝试使用django Templateform保存表单数据时才会考虑default
数据库,并且我收到如下错误:
Exception Type: OperationalError
Exception Value:
no such table: base_clientprofile
Exception Location: /opt/.../.../lib/python2.7/site-packages/django/db/backends/sqlite3/base.py in execute, line 485
以下是我的配置和代码示例。
settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'trace_one': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'somename',
'USER': 'rootuser',
'PASSWORD': 'password',
}
}
DATABASES_ROUTERS = ['DefaultRouter', 'TraceProdRouter']
forms.py
class TraceClientProfileForm(forms.ModelForm):
class Meta:
model = ClientProfile
fields = [
'full_name',
'short_name',
'address',
]
views.py
def trace_post_model_client_create_view(request):
form = TraceClientProfileForm(request.POST or None)
if form.is_valid():
obj = form.save(commit=False)
obj.save(using='trace_one')
return HttpResponseRedirect("/traceviews/{num}".format(num=obj.id))
context = {
"form": form
}
template = "trace_tmpl/trace_client_create_view.html"
return render(request, template, context)
urls.py
urlpatterns = patterns(
'',
url(r'^create/$', trace_post_model_client_create_view, name='traceclientcreate'),
)
routers.py
class MasterRouter(object):
def __init__(self, app_label):
super(MasterRouter, self).__init__()
self.app_label = app_label
def db_for_read(self, model, **hints):
if model._meta.app_label == self.app_label:
return self.app_label
return None
def db_for_write(self, model, **hints):
if model._meta.app_label == self.app_label:
return self.app_label
return None
def allow_relation(self, obj1, obj2, **hints):
if obj1._meta.app_label == self.app_label or obj2._meta.app_label == self.app_label:
return True
return None
def allow_syncdb(self, db, model):
if db == 'default':
return model._meta.app_label == self.app_label
elif model._meta.app_label == self.app_label:
return False
return None
class DefaultRouter(MasterRouter):
def __init__(self):
super(DefaultRouter, self).__init__('default')
class TraceProdRouter(MasterRouter):
def __init__(self):
super(TraceProdRouter, self).__init__('trace_one')