Да, это немного сложно.
Существует несколько способов реализовать это. По сути, вам нужен какой-то способ указать, какие модели связаны с какой базой данных.
Первый вариант
Вот код, который я использую; надеюсь, это поможет.
from django.db import connections
class DBRouter(object):
"""A router to control all database operations on models in
the contrib.auth application"""
def db_for_read(self, model, **hints):
m = model.__module__.split('.')
try:
d = m[-1]
if d in connections:
return d
except IndexError:
pass
return None
def db_for_write(self, model, **hints):
m = model.__module__.split('.')
try:
d = m[-1]
if d in connections:
return d
except IndexError:
pass
return None
def allow_syncdb(self, db, model):
"Make sure syncdb doesn't run on anything but default"
if model._meta.app_label == 'myapp':
return False
elif db == 'default':
return True
return None
То, как это работает, я создаю файл с именем базы данных, в которой хранятся мои модели. В вашем случае вы бы создали отдельный файл models
в стиле asterisk.py
, который находился в той же папке, что и модели для вашего приложения.
В вашем файле models.py
вы добавите
from asterisk import *
Тогда, когда вы фактически запрашиваете запись у этой модели, она работает примерно так:
records = MyModel.object.all()
- модуль для
MyModel
является myapp.asterisk
- есть соединение под названием "звездочка", поэтому используйте
это вместо "по умолчанию"
Второй вариант
Если вы хотите контролировать выбор базы данных для каждой модели, будет работать что-то вроде этого:
from django.db import connections
class DBRouter(object):
"""A router to control all database operations on models in
the contrib.auth application"""
def db_for_read(self, model, **hints):
if hasattr(model,'connection_name'):
return model.connection_name
return None
def db_for_write(self, model, **hints):
if hasattr(model,'connection_name'):
return model.connection_name
return None
def allow_syncdb(self, db, model):
if hasattr(model,'connection_name'):
return model.connection_name
return None
Тогда для каждой модели:
class MyModel(models.Model):
connection_name="asterisk"
#etc...
Обратите внимание, что я не проверял этот второй вариант.