簡體   English   中英

django:如何為工廠男孩動態指定數據庫

[英]django: how to specify database dynamically for factory boy

我正在設置一個包含大量數據庫的Django應用程序,其中一些使用相同的模型(它們不是復制品)。 我已經配置了我的路由器,一切都很好。 在進行測試時會出現問題,因為我想使用factory-boy

在一個不同的項目中,我可以在Meta設置數據庫但現在,我必須選擇在哪個數據庫上動態創建一個實例(如果沒有,我將不得不為每個數據庫創建一個DjangoModelFactory ,這不會很漂亮)。

是否有(更簡單的)方法為每個創建動態指定數據庫?

據我所知, factory_boyversion <=2.10.0 )沒有提供類似的東西。

但是,您的問題是使用上下文管理器的完美用例。 它允許您在需要的地方動態設置數據庫,並且只在期望的范圍內,並且還可以干!

# 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM