Как насчет указания вашей базы данных в вашем наборе запросов, я думаю, это будет проще сделать.
#settings.py
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'write_db',
'USER': 'postgres',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '5432',
},
'another_db': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'read_db',
'USER': 'postgres',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '5432',
}}
# views.py
def some_views(request):
if request.META["HOST"] == "www.example.com":
queryset = YourModels.objects.using("default").all()
elif request.META["HOST"] == "www.sub.example.com":
queryset = YourModels.objects.using("another_db").all()
return
ОБНОВЛЕНИЕ
надеюсь, это поможет вам.:)
import threading
from django.utils.deprecation import MiddlewareMixin
request_cfg = threading.local()
class RouterMiddleware(MiddlewareMixin):
def process_request(self, request):
url_host = request.META.get("HTTP_HOST")
if url_host == "www.example.com":
request_cfg.cfg = "read_db"
elif url_host == "www.sub.example.com":
request_cfg.cfg = "default"
return None
def process_response(self, request, response ):
return response
class DatabaseRouter:
def _default_db(self):
if hasattr( request_cfg, 'cfg' ):
return request_cfg.cfg
else:
return 'default'
def db_for_read(self, model, **hints):
return self._default_db()
def db_for_write(self, model, **hints):
return self._default_db()
не забудьте изменить ваши настройки.py:
#settings.py
DATABASE_ROUTERS = ['path.to.DatabaseRouter']
MIDDLEWARE = [...,
path.to.RouterMiddleware]