将装置加载到django中的多个数据库中

时间:2012-05-14 15:10:14

标签: django integration-testing multiple-databases

我有一个使用两个数据库的网站。我有一个如django文档中所述的路由器设置。当我使用runserver时,路由工作正常。但是我无法使用LiveServerTestCase进行测试。查询集为空。 我假设灯具未正确加载到第二个数据库中。 如果我删除数据库路由器(因此只使用一个数据库),测试工作。

这是我的路由器配置:

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

我在TestCase中设置了multi_db = True。

另一个问题是dumpdata --database = filemaker screener.ScreenerRouter返回一个空数组,即使数据库中有条目。我甚至可以在DjangoAdmin中编辑它们。我不得不将数据复制到默认数据库并从那里转储它。

1 个答案:

答案 0 :(得分:0)

我弄明白了这个问题。我有多个应用程序需要访问'filemaker'数据库,每个应用程序都有自己的路由器。 路由器按顺序处理。但是第一个路由器的allow_syncdb方法已经返回了一个值,该值阻止了所有其他应用程序的syncdb和dumpdata。

解决方案是为filemaker db编写一个MasterRouter并将所有应用程序放在那里。 如:

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