Sí, es un poco complicado.
Hay un número de maneras en que podría ponerla en práctica. Básicamente, necesita alguna forma de indicar qué modelos están asociados con qué base de datos.
Primera opción
Aquí está el código que utilizo; Espero eso ayude.
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
La forma en que esto funciona es creando un archivo con el nombre de la base de datos para usar que contiene mis modelos. En su caso, crearía un archivo de estilo models
separado llamado asterisk.py
que estaba en la misma carpeta que los modelos para su aplicación.
En el archivo models.py
, deberá añadir
from asterisk import *
Luego, cuando en realidad se solicita un registro de ese modelo, funciona algo como esto:
módulo
records = MyModel.object.all()
- para
MyModel
es myapp.asterisk
- hay una conexión llamada "asterisco" a fin de utilizar en lugar de "default"
segunda opción
Si desea tener un control por modelo de elección de base de datos, algo como esto funcionaría:
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
Luego, para cada modelo:
class MyModel(models.Model):
connection_name="asterisk"
#etc...
Tenga en cuenta que no he probado esta segunda opción.
Disculpe la demora en la respuesta, ¡pero fue inmensamente útil! – HurnsMobile
Hola, he implementado su segunda opción. Funciona muy bien, excepto para allow_syncdb. Voy a publicar una respuesta a continuación con un allow_syncdb de trabajo para los buscadores futuros. – Rich
¡Gracias por esto! Estaba teniendo muchísimo tiempo tratando de asimilar esto de los documentos de django. –