2010-08-19 17 views
18

Gibt es eine Möglichkeit anzugeben, dass ein Modell (oder eine App, gerade) immer nur eine bestimmte Datenbank verwenden soll?Django - Wie spezifiziert man eine Datenbank für ein Modell?

Ich arbeite mit einer Legacy-Datenbank, die ich nicht ändern möchte. Ich habe zwei Datenbanken - die 'Standard' ist eine SQLite, die für Admin usw. verwendet werden könnte, und die Legacy. Ich habe Inspectdb verwendet, um ein Modell für (einen Teil der) Legacy-Datenbank zu erstellen, und es hat managed = False. Aber gibt es eine Möglichkeit, im Modell selbst anzugeben, dass es nur für eine bestimmte Datenbank gilt?

Ich sehe, dass Sie specify using=databasename in einigen Abfrage-Sets usw. aber das ist nicht gut für Dinge wie Databrowse (und möglicherweise auch generische Ansichten?). Es kann ein Nachteil von Databrowse sein, dass Sie keine Datenbank angeben können, aber es scheint genau der richtige Ort zu sein, um es zu spezifizieren ...

Dann dachte ich, vielleicht ist die Antwort, einen Brauch zu schreiben model manager, das bezieht sich nur auf meine alte Datenbank - aber die Dokumente erwähnen nichts dergleichen.

Habe ich nur ein anderes mentales Modell, wie mehrere Datenbanken verwendet werden könnten, um die Django-Welt?

Antwort

2

Sie können keine Datenbank für ein Modell angeben, Sie können sie jedoch in einer benutzerdefinierten DB-Router-Klasse definieren.

# 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': { 
     .... 
    } 
} 
Verwandte Themen