2012-05-14 2 views
1

두 데이터베이스를 사용하는 웹 사이트가 있습니다. 난 장고 문서에 명시된 바와 같이 라우터를 설정했습니다. runserver를 사용할 때 라우팅이 올바르게 작동합니다. 그러나 LiveServerTestCase를 사용하여 테스트 할 수 없었습니다. queryset은 비어 있습니다. 조명기가 두 번째 데이터베이스에 올바르게로드되지 않았다고 가정합니다. 데이터베이스 라우터를 제거하면 테스트가 작동하므로 하나의 db 만 사용하십시오. 내가 테스트 케이스에 multi_db = true로 설정 한장고의 여러 데이터베이스에 고정물을로드하십시오.

class ScreenerRouter(object): 
    def db_for_read(self, model, **hints): 
     if model._meta.app_label == 'screener': 
      return 'filemaker' 
     return None 

    def db_for_write(self, model, **hints): 
     if model._meta.app_label == 'screener': 
      return 'filemaker' 
     return None 

    def allow_relation(self, obj1, obj2, **hints): 
     if obj1._meta.app_label == 'screener' or obj2._meta.app_label == 'screener': 
      return True 
     return None 

    def allow_syncdb(self, db, model): 
     if db == 'filemaker': 
      return model._meta.app_label == 'screener' 
     elif model._meta.app_label == 'screener': 
      return False 
     return None 

:

다음은 공유기의 설정입니다.

또 다른 문제점은 DB에 항목이 있어도 dumpdata --database = filemaker screener.ScreenerRouter는 빈 배열을 반환한다는 것입니다. DjangoAdmin에서 편집 할 수도 있습니다. 데이터를 기본 DB에 복사하고 거기에서 덤프해야했습니다.

답변

0

문제를 파악했습니다. 'filemaker'데이터베이스에 액세스해야하는 여러 앱이 있었고 각 앱마다 자체 라우터가있었습니다. 라우터가 순서대로 처리되었습니다. 그러나 첫 번째 라우터의 allow_syncdb 메소드는 이미 다른 모든 앱에 대해 syncdb 및 dumpdata를 방지하는 값을 반환했습니다.

해결책은 filemaker db에 대해 하나의 MasterRouter를 작성하고 거기에 모든 응용 프로그램을 넣는 것입니다. 다음으로 :

if obj1._meta.app_label in ['app1', 'app2']: 
    return 'filemaker' 
관련 문제