如何在托管 = False 的 Django 测试期间创建表?

Posted

技术标签:

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

来自oficial documentation:

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

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

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

【问题讨论】:

【参考方案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..."),
        ...
    ]

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

【讨论】:

以上是关于如何在托管 = False 的 Django 测试期间创建表?的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.7 - makemigrations 为非托管模型创建迁移

搭建Django测试环境时如何创建外部数据库?

对于 django 测试,我如何将 keepdb 与 mariadb 一起使用

如何在子路径中托管 Django 项目?

Django 测试 - 我只想创建一个数据库 - 如何指定

无法在 cpanel django 上提供媒体文件