2012-12-07 16 views
15

私はdjangoサイトに複数のアプリケーションを持っています。以下のようなdjangoの異なるアプリケーションに異なるデータベースを使用することができます

mainsite blog tutorials

しかし、私はそのジャンゴ

+0

たぶん関連settings.pyにDATABASE_ROUTERSを更新7970872/djangoでアプリケーションごとに異なるデータベースを使用する方法。 https://docs.djangoproject.com/en/dev/topics/db/multi-db/ –

答えて

21

でここで行うことができます私は、彼らが

を分離することができるように異なるデータベースに異なるモデルを保存するには、あなたが持っているだろうものです行こうとする。

1)使用するデータベースの設定を更新します。

settings.py

DATABASES = { 
'default': { 
    'ENGINE': 'django.db.backends.sqlite3', 
    'NAME': '/var/db/projectdb' 
} 
'db_app1': { 
    'ENGINE': 'django.db.backends.sqlite3', 
    'NAME': '/var/db/app1db' 
} 
'db_app2': { 
    'ENGINE': 'django.db.backends.sqlite3', 
    'NAME': '/var/db/app2db' 
} 

2)各データベースについて、クエリ適切ルートするデータベース・ルータを実装します。あなたのケースでは、各アプリで実装する。これは多かれ少なかれdjangoのドキュメントから取られていることに注意してください。 http://stackoverflow.com/questions/:

app1.dbRouter.py

# DB router for app1 

class App1DBRouter(object): 
    """ 
    A router to control app1 db operations 
    """ 
    def db_for_read(self, model, **hints): 
     "Point all operations on app1 models to 'db_app1'" 
     from django.conf import settings 
     if not settings.DATABASES.has_key('app1'): 
      return None 
     if model._meta.app_label == 'app1': 
      return 'db_app1' 
     return None 

    def db_for_write(self, model, **hints): 
     "Point all operations on app1 models to 'db_app1'" 
     from django.conf import settings 
     if not settings.DATABASES.has_key('app1'): 
      return None 
     if model._meta.app_label == 'app1': 
      return 'db_app1' 
     return None 

    def allow_relation(self, obj1, obj2, **hints): 
     "Allow any relation if a model in app1 is involved" 
     from django.conf import settings 
     if not settings.DATABASES.has_key('app1'): 
      return None 
     if obj1._meta.app_label == 'app1' or obj2._meta.app_label == 'app1': 
      return True 
     return None 

    def allow_syncdb(self, db, model): 
     "Make sure the app1 app only appears on the 'app1' db" 
     from django.conf import settings 
     if not settings.DATABASES.has_key('app1'): 
      return None 
     if db == 'db_app1': 
      return model._meta.app_label == 'app1' 
     elif model._meta.app_label == 'app1': 
      return False 
     return None 

3)

settings.py

DATABASE_ROUTERS = ['app1.dbRouter.App1DBRouter', 'app2.dbRouter.App2DBRouter'] 
+0

それはすべてですか?つまり、管理者からモデルを作成すると、自動的に2番目のデータベースに保存されます。または私は管理者のためにもっと多くのことをする必要がある – user825904

+0

あなたはsyncdbをする必要がある、私はあなたがDBが既に存在する場合、リセットする必要があるかもしれないと思う。 – Rohan

+0

DB名をいつ使うべきか、そしていつアプリケーションを使うべきかを区別するために、dbの名前を 'app1'からdb_app1に変更することを提案したいと思います。 –

関連する問題