回覆我的問題......
得到這個問題的唯一方法是讓一箇中間件獲取數據庫名稱和與當地人合作,是這樣的:
文件:中間件的.py
from threading import local
from django.contrib.sessions.models import Session
from django.contrib.auth.models import User
from web_core.models import UserProfile
my_local_global = local()
class CustomerMiddleware(object):
def process_request(self, request):
my_local_global.database_name = get_database_name(request)
def get_database_name(request):
session_key = request.session.session_key
try:
session = Session.objects.get(session_key=session_key)
uid = session.get_decoded().get('_auth_user_id')
user = User.objects.get(pk=uid)
profile = UserProfile.objects.get(pk=uid)
if profile:
return profile.dbname
else:
return None
except:
return None
在此之後,加在你設置middleware.py。 PY:
MIDDLEWARE_CLASSES = (
(..)
'middleware.CustomerMiddleware',
)
完成,作一次文件,以獲取DB路由器:
文件:authrouter:
class PadraoRouter(object):
def db_for_read(self, model, **hints):
from middleware import my_local_global
return my_local_global.database_name
def db_for_write(self, model, **hints):
from middleware import my_local_global
return my_local_global.database_name
def allow_relation(self, obj1, obj2, **hints):
return None
def allow_syncdb(self, db, model):
return True
class AuthRouter(object):
def db_for_read(self, model, **hints):
if model._meta.app_label == 'auth':
return 'auth_db'
if model._meta.app_label == 'sessions':
return 'auth_db'
if model._meta.app_label == 'web_core':
return 'auth_db'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label == 'auth':
return 'auth_db'
if model._meta.app_label == 'sessions':
return 'auth_db'
if model._meta.app_label == 'web_core':
return 'auth_db'
return None
def allow_relation(self, obj1, obj2, **hints):
if obj1._meta.app_label == 'auth' or\
obj2._meta.app_label == 'auth':
return True
if obj1._meta.app_label == 'sessions' or\
obj2._meta.app_label == 'sessions':
return True
if obj1._meta.app_label == 'web_core' or\
obj2._meta.app_label == 'web_core':
return True
return None
def allow_syncdb(self, db, model):
if db == 'auth_db':
return model._meta.app_label == 'auth'
elif model._meta.app_label == 'auth':
return False
return None
注:我需要把進口在每個閃避,因爲Django 1.5.1有一個bug,如果你把import導入文件頂部..循環導入..
之後,再次改變你的settings.py添加路由器:
DATABASE_ROUTERS = ['authrouter.AuthRouter',
'authrouter.PadraoRouter']
記住
我做出這種方式,因爲我有一個數據庫,只爲身份驗證。每個用戶都可以訪問不同的數據庫,這取決於什麼保存在dbname字段中。
如果您有其他解決方案,請讓我知道!
感謝大家。
我回答其他題目,差不多是這樣: http://stackoverflow.com/questions/17797419/modelforms-and-multiple-datasbase-error-in-form-is-valid/18020774#18020774 –