내 서버에 장고 애플리케이션이 있다고 가정하지만 사용자 및 그룹 모델/데이터가 다른 데이터베이스의 다른 서버에있는 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'에 저장되어있는 사용자를 사용하여 로그인 할 수 있도록합니다 장고에 내 데이터베이스 설정은이 같은 것?
위의 대답을 '예'라고 가정하면 내 로컬 DB (app 'myapp')에 사용자에게 ForeignKey가있는 모델이 있습니까? 즉, 내 모델 SomeModel은 MyApp를 정의하고 myapp_db에 존재해야하지만, my_auth_db에서 사용자에 대한 외래 키를 가지고 :
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.
두 번째 질문 :이 가능하거나 하나를 위해 단순히 불가능합니다 DB 테이블에 다른 DB의 테이블에 ForeignKey가 있습니까?
내가 정말로이 작업을하고 싶다면 IntegerField 'user_id'로 ForeignKey 필드 'user'를 바꿀 수 있습니까? 그러면 somemodel.user가 필요하면 somemodel.user_id가 필요하고 models.User.objects가 사용됩니다. .get (pk = somemodel.user_id), 여기서 라우터는 사용자에 대해 auth_db를 쿼리합니다. 이것이 가능한 접근법입니까?
감사합니다. 여기에서 볼 수 있듯이 사람들은 somemodel.user 구문을 사용하여 모델에 액세스 할 수 있도록 여러 가지 복잡한 솔루션을 만든 것처럼 보입니다. 이것은 단지 테스트 용 애플리케이션이므로 일반 IntegerField를 사용하고 user_id를 저장하고 (예를 들어) 다음과 같이 somemodel에 대한 사용자를 얻는 몇 가지 별도의 함수가 있다고 생각합니다. user = User.objects.get (pk = somemodel.user_id). 여전히 작동하는 것 같습니다. 참조 무결성이 없습니다. 즉, 누군가가 사용자를 삭제하면이 접근 방식은 user_id로 SomeModel 인스턴스를 자동으로 삭제하지 않습니다. – Marc
그래, 이것들은 복잡한 해결 방법이지만 Django는 모든 변경 요청을 거절한다. 그래서 우리가 겪어야 할 것들이있다 ... 성능이 그다지 문제가 아니라면,'user = User ....'접근법은 다음과 같다. 좋습니다. 그러나 스패닝 ForeignKey가 한 쿼리에서 수행 할 수있는 동안 액세스하는 각 개체의 사용자를 읽는 추가 쿼리를 실행합니다 (DB가 동일한 서버에있는 경우) – masterfloda