我有一个使用两个数据库的网站。我有一个如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中编辑它们。我不得不将数据复制到默认数据库并从那里转储它。
答案 0 :(得分:0)
我弄明白了这个问题。我有多个应用程序需要访问'filemaker'数据库,每个应用程序都有自己的路由器。 路由器按顺序处理。但是第一个路由器的allow_syncdb方法已经返回了一个值,该值阻止了所有其他应用程序的syncdb和dumpdata。
解决方案是为filemaker db编写一个MasterRouter并将所有应用程序放在那里。 如:
if obj1._meta.app_label in ['app1', 'app2']:
return 'filemaker'