2017-05-17 3 views
0

4 개의 데이터베이스에 연결할 사이트를 만들고 있습니다. 처음 세 개는 아무런 문제가 없습니다. 각 db에 대해 별도의 응용 프로그램을 만든 다음 각각에 대해 라우터를 만들었습니다. 마지막 db의 문제점은 라우터가 트리거하지 않는다는 것입니다. 트래픽을 기본 db로 계속 보냅니다. 기본 db는 app2이고 사용하고자하는 db는 'Login'입니다.Django DB Router가 올바른 테이블 대신 기본값 DB로 테이블을 전송합니다.

다음
DATABASE_ROUTERS = ['reports.dbrout.CucRouter', 'reports.dbrout.CpsgRouter', 'reports.dbrout.LoginRouter', ] 

이 바로 DB에 연결되지 않은 '로그인'응용 프로그램에서 모델 : 여기 여기 내 설정 선언 내 라우터

class LoginRouter(object): 
    def db_for_read(self, model): 

     if model._meta.app_label == 'Login': 
      return 'Login' 
     return 'default' 

입니다.

from __future__ import unicode_literals 

from django.db import models 


class TblUsers(models.Model): 
    userid = models.AutoField(db_column='userID', primary_key=True) 
    username = models.CharField(db_column='userName', max_length=100) 
    useremail = models.CharField(db_column='userEmail', unique=True, max_length=100) 
    userpass = models.CharField(db_column='userPass', max_length=100) 
    userstatus = models.CharField(db_column='userStatus', max_length=1) 
    tokencode = models.CharField(db_column='tokenCode', max_length=100) 
    companyid = models.CharField(db_column='companyID', max_length=255, blank=True, null=True) 
    fk_customer = models.IntegerField(blank=True, null=True) 
    is_admin = models.IntegerField(blank=True, null=True) 

    class Meta: 
     managed = False 
     db_table = 'tbl_users' 
     app_label = 'Login' 

    def __str__(self): 
     return str(self.userid) 

전체 dbrout 페이지 :

class CucRouter(object): 
    def db_for_read(self, model): 

     if model._meta.app_label == 'CUCMCDR': 
      return 'CUCMCDR' 
     return 'default' 


    class CpsgRouter(object): 
     def db_for_read(self, model): 

     if model._meta.app_label == 'CPSG': 
      return 'CUCMCDR' 
     return 'default' 


class LoginRouter(object): 
    def db_for_read(self, model): 

     if model._meta.app_label == 'Login': 
      return 'Login' 
     return 'default' 

나는 이것이 처음 세 근무 말했듯이. 내가 여기에서 놓치게되는 것은 마지막 하나를 위해 붙잡지 않고있다!? ???

+0

CucRouter 전에 다음 LoginRouter가 처리 할 LoginRouterCucRouter에 사용되는 경우는, 주문 확인 설정하는 동안. db_for_read 메소드에 전달할 모델의 선언을 포함시킬 수 있습니까? –

+0

예 지금 편집 중이므로 – Joe

+0

DATABASE_ROUTERS 시퀀스가 ​​중요하므로 먼저 reports.dbrout.LoginRouter를 추가 한 다음 시도하십시오. 그것이 효과가 있을지 모른다. – Sanjay

답변

0

라우터가 처리되는 순서가 중요합니다. 라우터는 DATABASE_ROUTERS 설정에 나열된 순서대로 쿼리됩니다.
아래와 같이 추가하십시오.
DATABASE_ROUTERS = ['reports.dbrout.LoginRouter','reports.dbrout.CucRouter', 'reports.dbrout.CpsgRouter',]

것은 Login app_label 나는 우리가 더 많은 정보를 필요가 있다고 생각

+0

나는 그것을 지금 설정하고 로그인 앱을 작동 시키지만 두 개의 다른 라우터를 깨뜨릴 것이다. 나는 그 문제를 단지 옮겼다. 각 라우터는 자체 클래스에 있습니다. 어쩌면 내가 할 수/다른 경로를 하나의 클래스에서 체인 ?? – Joe

+0

@Joe, 문제의 모든 라우터 클래스를 추가 할 수 있습니까? 그래서 그것은 명확한 아이디어를 줄 것입니다. – Sanjay

+0

예. 지금 추가 중입니다. – Joe