2010-08-19 40 views
18

¿Existe alguna manera de especificar que un modelo (o aplicación, incluso) solo debe usar una base de datos en particular?Django: ¿cómo especificar una base de datos para un modelo?

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 admin, etc., y la heredada. Utilicé inspectdb para crear un modelo para (parte de) la base de datos heredada, y tiene managed = False. Pero, ¿hay alguna forma de especificar en el modelo que solo se aplique a una base de datos en particular?

Veo que puede specify 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 una falla de Databrowse que no se pueda especificar una base de datos, pero parece que es el lugar correcto para especificar que es el modelo ...

Luego pensé que tal vez la respuesta es escribir una versión personalizada model manager que solo se refiere 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 múltiples bases de datos para el mundo de Django?

Respuesta

2

No puede especificar una base de datos para un modelo, pero puede definirla en una clase de enrutador de 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': { 
     .... 
    } 
} 
Cuestiones relacionadas