2016-05-02 40 views
4

我有django应用程序与遗留数据库5遗留下来。几乎所有型号都使用元属性managed=False进行设置。由于managed=False已设置,因此已使用选项managed=False创建了每个型号的迁移。而且,由于django测试运行器为每个模型选择现有的迁移以在test_databases中创建测试表,因此它不会创建任何内容。 我试图创建test.py设置与以下解决文件:与几个遗留数据库测试django应用程序

from web_services.settings.dev import * 
from django.test.runner import DiscoverRunner 


class UnManagedModelTestRunner(DiscoverRunner): 

    def setup_test_environment(self, *args, **kwargs): 
     from django.apps import apps 
     self.unmanaged_models = [m for m in apps.get_models() if not m._meta.managed] 
     for m in self.unmanaged_models: 
      m._meta.managed = True 
     super(UnManagedModelTestRunner, self).setup_test_environment(*args, **kwargs) 

    def teardown_test_environment(self, *args, **kwargs): 
     super(UnManagedModelTestRunner, self).teardown_test_environment(*args, **kwargs) 
     # reset unmanaged models 
     for m in self.unmanaged_models: 
      m._meta.managed = False 

TEST_RUNNER = 'web_services.settings.test.UnManagedModelTestRunner' 

和运行python manage.py test --settings=web_services.settings.test。然而,它并没有帮助,因为无论如何 - 现有的迁移已经使用managed=False选项创建。只有在我的模型managed=False中注释掉了,删除了旧的迁移,创建了新的迁移(没有managed=False选项)后,测试似乎才起作用。因此,我非常失落 - 在我的案例(多个遗留数据库)中编写测试的实际做法是什么?处理调整迁徙的麻烦似乎是错误的。

回答

5

这是我现在如何解决我的问题。这与managed=False选项这个样子的创建

迁移:

# migrations/0001_initial.py 
migrations.CreateModel(
      name='MyModel', 
      fields=[ 
       ('field_id', models.IntegerField(primary_key=True, serialize=False)), 
       ('slug', models.CharField(max_length=20, unique=True)), 
       ('name', models.CharField(max_length=64)), 
      ], 
      options={ 
       'db_table': 'MyModel', 
       'managed': False, 
      }, 
     ), 

人们需要注释掉'managed': False以允许应用迁移。为了不与实际迁移的一塌糊涂,我已经创建的文件夹test_migrations'managed': False注释掉复制有我的迁移:

# test_migrations/0001_initial.py 
migrations.CreateModel(
      name='MyModel', 
      fields=[ 
       ('field_id', models.IntegerField(primary_key=True, serialize=False)), 
       ('slug', models.CharField(max_length=20, unique=True)), 
       ('name', models.CharField(max_length=64)), 
      ], 
      options={ 
       'db_table': 'MyModel', 
       # 'managed': False, 
      }, 
     ), 

然后,我们需要试运行期间参照这些迁移。为此,我创建了设置文件test.py并提供了必要的参考。就像这样:

from web_services.settings.dev import * 


MIGRATION_MODULES = { 
    'myapp': 'web_services.apps.myapp.test_migrations', 
} 

当运行测试时,需要指的是设置:

python manage.py test --settings=web_services.settings.test

+0

感谢。这一段时间我一直在th th。您的解决方案是唯一的解决方案(导入设置时出现问题,但也得到了解决方法) –

+0

尽管我不特别喜欢需要单独备份迁移,但它是我唯一的工作解决方案到目前为止发现。 – msonsona

+0

@AmirTugi谢谢你的回答。但是,如果你在sys.argv中加入'''if'test',你可以通过干净的方式来改善这个问题:'settings.py'中的这个'''this'MIGRATION_MODULES = { 'iop_bypass':'test_migrations', }好处是1.你不需要新的test_settings.py 2.你不需要运行额外的参数测试3.你没有得到linting问题说你在PEP8中进行通配符导入 – Dinesh

相关问题