【问题标题】:How to create table during Django tests with managed = False?如何在托管 = False 的 Django 测试期间创建表?
【发布时间】:2015-05-02 06:35:59
【问题描述】:

来自oficial documentation

对于涉及带有managed=False 的模型的测试,您需要确保在测试设置中创建正确的表。

我不知道如何在测试设置中创建表。我找到了这个question 并且接受的答案对我不起作用。我认为这是因为迁移文件。配置在迁移文件中,“即时”更改值没有任何效果。

在 Django 1.7+ 中解决这个问题的方法是什么?

【问题讨论】:

    标签: python django django-testing django-1.7 django-migrations


    【解决方案1】:

    我认为在 Django 1.7+ 中应该是类似的。当您要运行测试时,您应该使用 Django 管理这些模型(仅用于测试目的)。 这种转换应该在创建表之前完成,Django 允许你在你的 settings.py 中给一个类实例设置 TEST_RUNNER

    # settings_test.py
    TEST_RUNNER = 'utils.test_runner.ManagedModelTestRunner'
    
    # test_runner.py
    from django.test.runner import DiscoverRunner
    
    class ManagedModelTestRunner(DiscoverRunner):
        """
        Test runner that automatically makes all unmanaged models in your Django
        project managed for the duration of the test run, so that one doesn't need
        to execute the SQL manually to create them.
        """  
        def setup_test_environment(self, *args, **kwargs):
            from django.db.models.loading import get_models
            super(ManagedModelTestRunner, self).setup_test_environment(*args,
                                                                       **kwargs)
            self.unmanaged_models = [m for m in get_models(only_installed=False)
                                     if not m._meta.managed]
            for m in self.unmanaged_models:
                m._meta.managed = True
    
        def teardown_test_environment(self, *args, **kwargs):
            super(ManagedModelTestRunner, self).teardown_test_environment(*args, **kwargs)
            # reset unmanaged models
            for m in self.unmanaged_models:
                m._meta.managed = False
    

    【讨论】:

    • 此代码不起作用。我认为问题在于 Django 现在使用迁移,而这段代码并没有改变它们。
    【解决方案2】:

    我找到了办法。修改fixture并添加生成表的SQL:

    #0001_initial.py (or followings)
    class Migration(migrations.Migration):
    
        operations = [
            migrations.RunSQL("CREATE TABLE..."),
            ...
        ]
    

    我是“迁移新手”,所以我不知道这是否是最佳选择。但它有效。

    【讨论】:

      猜你喜欢
      • 2011-10-24
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多