form - Django-¿Cómo especificar una base de datos para un modelo?
django templates examples (2)
¿Hay una manera de especificar que un modelo (o aplicación, incluso) solo debería usar una base de datos en particular?
Estoy trabajando con una base de datos heredada que no quiero cambiar. Tengo dos bases de datos: la "predeterminada" es una sqlite que se puede usar para la administración, etc. y la heredada. Usé inspectdb para crear un modelo para (parte de) la base de datos heredada, y se ha managed = False
. Pero, ¿hay una manera de especificar en el propio modelo que solo se aplica a una base de datos en particular?
Veo que puede especificar el using=databasename
en algunos conjuntos de consultas, etc. pero esto no es bueno para cosas como Databrowse (y posiblemente también vistas genéricas?). Puede ser un poco de Databrowse que no puede especificar una base de datos, pero parece que el lugar correcto para especificarlo es el modelo ...
Entonces pensé que tal vez la respuesta es escribir un administrador de modelos personalizado que solo haga referencia a mi base de datos heredada, pero los documentos no mencionan nada de eso.
¿Acabo de tener un modelo mental diferente de cómo se pueden usar las bases de datos múltiples, para el mundo Django?
No puede especificar una base de datos para un modelo, pero puede definirla en una clase de enrutador DB personalizada.
# app/models.py
class SomeModel(models.Model):
...
# app/dbrouters.py
from app.models import SomeModel
...
class MyDBRouter(object):
def db_for_read(self, model, **hints):
""" reading SomeModel from otherdb """
if model == SomeModel:
return ''otherdb''
return None
def db_for_write(self, model, **hints):
""" writing SomeModel to otherdb """
if model == SomeModel:
return ''otherdb''
return None
# app/settings.py
DATABASE_ROUTERS = (''app.dbrouters.MyDBRouter'',)
...
DATABASES = {
...
''otherdb'': {
....
}
}
Por lo que sé, no puede especificar la base de datos directamente con el modelo, ya que evitaría que la aplicación fuera reutilizable, pero por lo que puedo ver en los documentos: