首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django:如何为工厂男孩动态指定数据库

django:如何为工厂男孩动态指定数据库
EN

Stack Overflow用户
提问于 2018-02-13 02:30:14
回答 1查看 683关注 0票数 4

我正在设置一个具有许多数据库的Django应用程序,其中一些数据库使用相同的模型(它们不是副本)。我已经配置了我的路由器,一切都运行得很好。当我想使用factory-boy进行测试时,出现了这个问题。

在不同的项目中,我可以在Meta中设置数据库,但现在,我必须选择在哪个数据库上动态创建实例(如果不是这样,我将不得不为每个数据库创建一个DjangoModelFactory,这不是很好)。

有没有一种(更简单的)方法来为每次创建动态指定数据库?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-17 01:00:13

据我所知,factory_boy (version <=2.10.0)没有提供这样的功能。

不过,您的问题是使用上下文管理器的完美用例。它将允许您在需要的任何地方动态设置数据库,并且仅在所需的范围内设置,并且还可以干式!:

代码语言:javascript
复制
# 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

然后,在你的测试中,你可以这样做:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48753155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档