1

내 서버에 장고 애플리케이션이 있다고 가정하지만 사용자 및 그룹 모델/데이터가 다른 데이터베이스의 다른 서버에있는 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를 쿼리합니다. 이것이 가능한 접근법입니까?

답변

1

질문 1에 대한 답변은 다음과 같습니다. 예.

어떤 경우 든 필요한 것은 database router입니다. 장고 문서의 예는 인증 앱에 대한 내용이므로 여기에서이 코드를 복사 할 필요는 없습니다.

질문 2에 대한 답변은 다음과 같습니다. 공식적으로는 아닙니다. 그것은 당신이 설정 한 방법 MySQL의에 따라 달라집니다

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

장고 현재 외래 키 또는 여러 데이터베이스에 걸쳐 대다 관계에 대한 지원을 제공하지 않습니다.

참조 무결성입니다.

그러나 SQLite 또는 MySQL과 MyISAM 테이블을 사용하는 경우 참조 무결성이 적용되지 않습니다. 결과적으로 '가짜'데이터베이스 외부 키에 액세스 할 수 있습니다. 그러나이 구성은 Django에서 공식적으로 지원하지 않습니다.

나는 몇 가지 기존 MySQL DB (읽기 전용)가 설치되어 있습니다.몇 가지 추가를 제공 할 수

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

관련 질문이 대답은 따옴표로 테이블 이름을 설정하는 것입니다 나중에 (이 허용 대답에 명시된 바와 같이) Django ManyToMany through with multiple databases과 솔루션을 문제로 실행 How to use django models with foreign keys in different DBs?

보여줍니다 정보 :

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?

,536,

누구든지이 정보를 모두 가지고 장고 장교 (Django DOC)에 넣어 주면 좋을 것입니다 :-)

+0

감사합니다. 여기에서 볼 수 있듯이 사람들은 somemodel.user 구문을 사용하여 모델에 액세스 할 수 있도록 여러 가지 복잡한 솔루션을 만든 것처럼 보입니다. 이것은 단지 테스트 용 애플리케이션이므로 일반 IntegerField를 사용하고 user_id를 저장하고 (예를 들어) 다음과 같이 somemodel에 대한 사용자를 얻는 몇 가지 별도의 함수가 있다고 생각합니다. user = User.objects.get (pk = somemodel.user_id). 여전히 작동하는 것 같습니다. 참조 무결성이 없습니다. 즉, 누군가가 사용자를 삭제하면이 접근 방식은 user_id로 SomeModel 인스턴스를 자동으로 삭제하지 않습니다. – Marc

+0

그래, 이것들은 복잡한 해결 방법이지만 Django는 모든 변경 요청을 거절한다. 그래서 우리가 겪어야 할 것들이있다 ... 성능이 그다지 문제가 아니라면,'user = User ....'접근법은 다음과 같다. 좋습니다. 그러나 스패닝 ForeignKey가 한 쿼리에서 수행 할 수있는 동안 액세스하는 각 개체의 사용자를 읽는 추가 쿼리를 실행합니다 (DB가 동일한 서버에있는 경우) – masterfloda