サーバに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をクエリすることを知っていますか?これは実行可能なアプローチですか?
これは素晴らしい情報です、ありがとう!ここからわかるように、somemodel.user構文を使用してモデルにアクセスできるように、多少複雑なソリューションを作成したように見えます。これは単なるテストアプリケーションなので、私は単純なIntegerFieldとstore user_idを使い、いくつかの別個の関数を持っていると思います(例えば、次のようなsomemodelのためにユーザを取得する):user = User.objects.get(pk = somemodel.user_id )。これはまだ動作するように見えます。参照整合性はありません。つまり、あるユーザーがユーザーを削除した場合、このアプローチは自動的にsomeModelインスタンスをuser_idで削除しません。 – Marc
ええ、これらは複雑な回避策ですが、すべての変更要求はDjangoによって拒否されるため、これは私たちが抱えている問題です...パフォーマンスがそれほど問題ではない場合、 'user = User ....'アプローチはOKですが、アクセスしている各オブジェクトのユーザーを読み取る追加のクエリが発生しますが、スパニングのForeignKeyは1つのクエリでこれを実行できます(ただし、DBが同じサーバー上にある場合) – masterfloda