2010-08-19 7 views
18

Existe-t-il un moyen de spécifier qu'un modèle (ou une application, même) ne doit jamais utiliser qu'une base de données particulière?Django - comment spécifier une base de données pour un modèle?

Je travaille avec une base de données existante que je ne veux pas changer. J'ai deux bases de données - le 'défaut' est un sqlite qui pourrait être employé pour l'admin etc., et l'héritage. J'ai utilisé inspectdb pour créer un modèle pour (partie de) la base de données existante, et il a managed = False. Mais existe-t-il un moyen de spécifier dans le modèle lui-même qu'il ne s'applique qu'à une base de données particulière?

Je vois que vous pouvez specify using=databasename dans certains ensembles de requêtes etc, mais ce n'est pas bon pour des choses comme Databrowse (et peut-être aussi des vues génériques?). Il peut être un peu court de Databrowse que vous ne pouvez pas spécifier une base de données, mais il semble juste que le bon endroit pour spécifier c'est le modèle ...

Ensuite, je pensais que peut-être la réponse est d'écrire une coutume model manager qui ne fait référence qu'à ma base de données existante - mais les docs ne mentionnent rien de pareil. Est-ce que je viens d'avoir un modèle mental différent de la façon dont plusieurs bases de données pourraient être utilisées, dans le monde de Django?

Répondre

10

Pour autant que je sais que vous ne pouvez pas spécifier la base de données directement avec le modèle, car il serait sorte d'empêcher l'application de jamais être réutilisable, mais de ce que je peux voir dans les docs:

https://docs.djangoproject.com/en/1.8/topics/db/multi-db/

2

Vous ne pouvez pas spécifier de base de données pour un modèle, mais vous pouvez le définir dans une classe de routeur DB personnalisée.

# 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': { 
     .... 
    } 
} 
Questions connexes