作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在设置一个包含大量数据库的 Django 应用程序,其中一些使用相同的模型(它们不是副本)。我已经配置了我的路由器并且一切正常。当我想使用 factory-boy
进行测试时出现问题。
在另一个项目中,我可以在 Meta
中设置数据库,但现在,我必须选择在哪个数据库上动态创建实例(如果没有,我将不得不创建一个 DjangoModelFactory
对于每个数据库,这不会很漂亮)。
是否有一种(更简单的)方法来为每次创建动态指定数据库?
最佳答案
据我所知factory_boy
( version <=2.10.0
) 没有提供类似的东西。
不过,您的问题是使用上下文管理器的完美用例。它将允许您在任何需要的地方动态设置数据库,并且只在所需的范围内,并且 DRY!:
# factoryboy_utils.py
@classmethod
def _get_manager(cls, model_class):
return super(cls, cls)._get_manager(model_class).using(cls.database)
class DBAwareFactory(object):
"""
Context manager to make model factories db aware
Usage:
with DBAwareFactory(PersonFactory, 'db_qa') as personfactory_on_qa:
person_on_qa = personfactory_on_qa()
...
"""
def __init__(self, cls, db):
# Take a copy of the original cls
self.original_cls = cls
# Patch with needed bits for dynamic db support
setattr(cls, 'database', db)
setattr(cls, '_get_manager', _get_manager)
# save the patched class
self.patched_cls = cls
def __enter__(self):
return self.patched_cls
def __exit__(self, type, value, traceback):
return self.original_cls
然后,在您的测试中,您可以执行以下操作:
from factoryboy_utils import DBAwareFactory
class MyTest(TestCase):
def test_mymodel_on_db1(self):
...
with DBAwareFactory(MyModelFactory, 'db1') as MyModelFactoryForDB1:
mymodelinstance_on_db1 = MyModelFactoryForDB1()
# whatever you need with that model instance
...
# something else here
def test_mymodel_on_db2(self):
...
with DBAwareFactory(MyModelFactory, 'db2') as MyModelFactoryForDB2:
mymodelinstance_on_db2 = MyModelFactoryForDB2()
# whatever you need with that model instance
...
# something else here
关于python - django:如何为工厂男孩动态指定数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48753155/
我是一名优秀的程序员,十分优秀!