1

我有一个使用两个数据库的网站。我按照 django 文档中的说明设置了路由器。当我使用 runserver 时,路由工作正常。但是我无法使用 LiveServerTestCase 对其进行测试。查询集为空。我假设固定装置没有正确加载到第二个数据库中。如果我删除数据库路由器(因此只使用一个 db),测试就可以工作。

这是我的路由器配置:

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 中编辑它们。我不得不将数据复制到默认数据库并从那里转储。

4

1 回答 1

0

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

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

if obj1._meta.app_label in ['app1', 'app2']:
    return 'filemaker'
于 2012-06-06T18:35:12.387 回答