2012-05-14 1 views
1

У меня есть сайт, который использует две базы данных. У меня установлен маршрутизатор, как указано в документации django. Маршрутизация работает отлично, когда я использую сервер. Однако я не смог проверить его с помощью 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 = True в TestCase.

Другая проблема заключалась в том, что dumpdata --database = filemaker screener.ScreenerRouter возвращает пустой массив, хотя в базе данных есть записи. Я даже могу их редактировать в DjangoAdmin. Мне пришлось копировать данные в базу данных по умолчанию и выгружать ее оттуда.

ответ

0

Я понял проблему. У меня было несколько приложений, которым нужен доступ к базе данных «filemaker», и каждый из них имел свой собственный маршрутизатор. Роутеры обрабатывались по порядку. Но метод allow_syncdb первого маршрутизатора уже возвратил значение, которое предотвращало syncdb и dumpdata для всех других приложений.

Решение заключалось в том, чтобы написать один MasterRouter для db filemaker и разместить там все приложения. Как в:

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