2016-09-22 13 views
0

アプリの最初のページに2つのリンクがあるとします。どのリンクがクリックされたかに応じてデータベースを選択することは可能ですか?データベースはどちらも同じモデルですが、データは異なります。たとえば、アプリケーションに異なる大学の学生が含まれているとします(AB)。 Aのリンクをクリックすると、Aのデータベースが使用され、大学の学生はAとなります。この後のアプリケーション全体では、大学のデータベースAを使用する必要があります。DjangoのURLに基​​づくデータベースの動的選択

私は、この問題を回避する方法として、データベースを異なる方法で設計すること、つまり大学の分野を持つことだけでなく、特定の大学提携の学生を除外することによって解決する方法があることを理解しています。しかし、私はDjangoを使用して2つの異なるデータベースを使用するだけのソリューションを探しています。

+0

複数のデータベースを持つことが記述されているページ[django docs](https://docs.djangoproject.com/en/1.10/topics/db/multi-db/)があります –

+0

そのページには何も役立たないようです、 .using( 'default') 'は現実的な解決策ではありません。データベースを動的に選択する別の方法はありますか? – Harvinder

+0

dbルータを見ましたか?ユーザー選択をルータに渡す方法を理解する必要があります。 – serg

答えて

1

したがって、選択したデータベースをsessionまたはsmthに保存する必要があり、データベースを簡単に選択できます。 docs

>>> # This will run on the 'default' database. 
>>> Author.objects.all() 

>>> # So will this. 
>>> Author.objects.using('default').all() 

>>> # This will run on the 'other' database. 
>>> Author.objects.using('other').all() 
+0

ええ、これは私が探している行に沿ったものですが、 '.using( 'default')'の代替手段がありますか?だから基本的にデータベースを動的に選択する別の方法は? – Harvinder

+0

@Harvinderなぜこのメソッドはあなたを満足させないのですか?つまり、これがドキュメントにあれば、確かに良い選択です。 –

+0

@Harvinderあなたは[SQLAlchemy](http://www.sqlalchemy.org/)を使うこともできますが、これは別の話ですが、django-modelsとの互換性はありません。 –

0

からは、使用するデータベースを把握するための要求を検査し、データベースのルーターを作成するには、このGlobalRequestMiddleware液とともにDatabase Routers混ぜることができます。

class RequestDatabaseRouter(object): 
    def db_for_read(self, model, **hints): 
    request = GlobalRequestMiddleware.get_current_request() 
    key = self.get_database_key(request) # Implement get_database_key 
    return key 

は、しかし、私はどのように現時点では気づいていないよ、私はミドルウェアソリューションよりも好ましいことだと思う**hintsへの要求を、注入するいくつかの方法があるかもしれません。 AuthenticationMiddlewareの後にGlobalRequestMiddlewareが呼び出されていることを確認する必要があるかもしれません。さもなければ、検査する要求にユーザーがいないかもしれません。

関連する問題