1

サーバにdjangoアプリケーションがあるとしますが、ユーザとグループのモデル/データが別のデータベースの別のサーバにあるdjango.contrib.auth.modelsを使用して認証を行いたいとします。複数のデータベースとユーザの外出先を持つdjango

DATABASES = { 
    'default': {}, 
    'auth_db': { 
     'NAME'  : 'my_auth_db', 
     'ENGINE' : 'django.db.backends.mysql', 
     'USER'  : 'someuser', 
     'PASSWORD' : 'somepassword', 
     'HOST'  : 'some.host.com', 
     'PORT'  : '3306', 
    }, 
    'myapp': { 
     'NAME': 'myapp_db', 
     'ENGINE': 'django.db.backends.mysql', 
     'USER': 'localuser', 
     'PASSWORD': 'localpass', 
    } 
} 

DATABASE_ROUTERS = ['pathto.dbrouters.AuthRouter', 'pathto.dbrouters.MyAppRouter'] 

最初の質問:ジャンゴでは、私のデータベース設定は、このようなものになるだろう。この作品は、すなわち、それは私がリモートDB「my_auth_db」に保存されているユーザーを使用して、私のDjangoアプリケーションにログインできるようになりますでしょうか?

上記の答えが「はい」であると仮定すると、私のローカルDB(app 'myapp')に、ユーザーに外部キーを持つモデルがあるとどうなりますか?言い換えれば、私のモデルSomeModelはmyappの中で定義され、myapp_dbに存在する必要がありますが、それはmy_auth_dbでのユーザーへのForeignKeyを持っている:

class SomeModel(models.model): 
    user = models.ForeignKey(User, unique=False, null=False) 
    description = models.CharField(max_length=255, null=True) 
    dummy = models.CharField(max_length=32, null=True) 
    etc. 

2番目の質問:これは可能ですかそれは1のため、単純にはできませんDBテーブルに別のDBのテーブルへのForeignKeyを持っていますか?

もし私が本当にこの作業をしたいのであれば、ForeignKeyフィールド 'user'をIntegerField 'user_id'に置き換えて、somemodel.userが必要ならば代わりにsomemodel.user_idを取得し、models.User.objects .get(pk = somemodel.user_id)。ここで、ルータはユーザのためにauth_dbをクエリすることを知っていますか?これは実行可能なアプローチですか?

答えて

1

質問1の答えは:はい。

いずれにしても必要なものはdatabase routerです(Djangoのドキュメントの例はauthアプリに関するものなので、ここでこのコードをコピーする必要はありません)。

質問2の答えは:多分。正式ではありません。

ジャンゴは現在、外部キーまたは複数のデータベースにまたがる多対多の関係のためのあらゆるサポートを提供していません

https://docs.djangoproject.com/en/dev/topics/db/multi-db/#limitations-of-multiple-databases

:それはあなたがMySQLを設定した方法によって異なります。

参照整合性のためです。

しかし、SQLiteまたはのMySQLとMyISAMテーブルを使用している場合は、参照整合性が強制されません。結果として、あなたは'fake'データベースの異種キーにアクセスすることができます。しかし、この設定はDjangoによって正式にサポートされていません。

私はいくつかのレガシーMySQLデータベース(読み取り専用)を使用してセットアップしています。この答えは、引用符でテーブル名を設定することです(そこ受け入れ答えで述べたように)私は後でDjango ManyToMany through with multiple databasesと溶液とのトラブルに遭遇したHow to use django models with foreign keys in different DBs?

を示しています

class Meta:  
    db_table = '`%s`.`table2`' % db2_name 

いくつかの追加を提供するかもしれない関連の質問情報:

How to work around lack of support for foreign keys across databases in Django

How to use django models with foreign keys in different DBs?

誰かがこの情報をすべて取って正式なDjangoの文書に入れてくれればうれしいです:-)

+0

これは素晴らしい情報です、ありがとう!ここからわかるように、somemodel.user構文を使用してモデルにアクセスできるように、多少複雑なソリューションを作成したように見えます。これは単なるテストアプリケーションなので、私は単純なIntegerFieldとstore user_idを使い、いくつかの別個の関数を持っていると思います(例えば、次のようなsomemodelのためにユーザを取得する):user = User.objects.get(pk = somemodel.user_id )。これはまだ動作するように見えます。参照整合性はありません。つまり、あるユーザーがユーザーを削除した場合、このアプローチは自動的にsomeModelインスタンスをuser_idで削除しません。 – Marc

+0

ええ、これらは複雑な回避策ですが、すべての変更要求はDjangoによって拒否されるため、これは私たちが抱えている問題です...パフォーマンスがそれほど問題ではない場合、 'user = User ....'アプローチはOKですが、アクセスしている各オブジェクトのユーザーを読み取る追加のクエリが発生しますが、スパニングのForeignKeyは1つのクエリでこれを実行できます(ただし、DBが同じサーバー上にある場合) – masterfloda

関連する問題