2012-05-14 55 views
1

我有一個使用兩個數據庫的網站。我按照django文檔中的說明建立了一個路由器。當我使用runserver時,路由工作正常。但是我無法使用LiveServerTestCase對其進行測試。該查詢集是空的。 我假設燈具沒有正確加載到第二個數據庫中。 如果我刪除數據庫路由器(因此只使用一個數據庫),測試將起作用。加載裝置到Django的多個數據庫中

這裏是我的路由器的配置:

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 

我在測試用例集multi_db =真。

另一個問題是,dumpdata --database = filemaker screener.ScreenerRouter返回一個空數組,即使DB中有條目。我甚至可以在DjangoAdmin中編輯它們。我不得不將數據複製到默認數據庫並從那裏轉儲它。

回答

0

我想出了這個問題。我有多個需要訪問'filemaker'數據庫的應用程序,每個應用程序都有自己的路由器。 路由器按順序處理。但是第一個路由器的allow_syncdb方法已經返回了一個值,它阻止了所有其他應用的syncdb和dumpdata。

解決方案是爲filemaker db編寫一個MasterRouter,並將所有應用程序放在那裏。 如:

if obj1._meta.app_label in ['app1', 'app2']: 
    return 'filemaker'