Ответ 1
Да, это немного сложно.
Существует несколько способов его реализации. В принципе, вам нужно каким-то образом указать, какие модели связаны с какой базой данных.
Первая опция
Вот код, который я использую; надеюсь, что это поможет.
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
-style с именем asterisk.py
, который был в той же папке, что и модели для вашего приложения.
В вашем файле models.py
добавьте
from asterisk import *
Затем, когда вы действительно запрашиваете запись с этой модели, она работает примерно так:
-
records = MyModel.object.all()
- модуль
MyModel
-myapp.asterisk
- существует соединение под названием "звездочка", поэтому используйте вместо "default"
Второй вариант
Если вы хотите иметь контроль над выбором базы данных для каждой модели, что-то вроде этого будет работать:
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...
Обратите внимание, что я не тестировал этот второй вариант.