Ответить на мой собственный вопрос ...
Единственный способ получить это право, это сделать одно промежуточное программное обеспечение, чтобы получить имя базы данных и работать с местными жителями, как это:
Файл: промежуточного слоя .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 в ваших настройки. ру:
MIDDLEWARE_CLASSES = (
(..)
'middleware.CustomerMiddleware',
)
закончить, сделать еще один файл, чтобы получить дб маршрутизатор:
Файл: 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 имеет ошибку, если вы поместили импорт в верхнюю часть файла .. цикл импорта ..
после этого, измените ваш 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 –