升级Django与Python后测试失败问题排查
问题:Django升级后测试执行失败(ImportError: cannot import name 'get_app')
环境变更记录
- Django版本从4.0.5升级至4.1.6
- Python版本从3.9升级至3.11
- 升级的依赖列表:
pip==23.0 pytest==7.2.1 pytest-django==4.5.2 coverage==7.1.0 pytest-cov==4.0.0 pylint==2.16.2 mock==5.0.1
报错日志
django-admin test Traceback (most recent call last): File "/usr/local/bin/django-admin", line 8, in <module> sys.exit(execute_from_command_line()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line utility.execute() File "/usr/local/lib/python3.11/site-packages/django/core/management/__init__.py", line 440, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/usr/local/lib/python3.11/site-packages/django/core/management/commands/test.py", line 24, in run_from_argv super().run_from_argv(argv) File "/usr/local/lib/python3.11/site-packages/django/core/management/base.py", line 394, in run_from_argv parser = self.create_parser(argv[0], argv[1]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/django/core/management/base.py", line 357, in create_parser self.add_arguments(parser) File "/usr/local/lib/python3.11/site-packages/django/core/management/commands/test.py", line 54, in add_arguments test_runner_class = get_runner(settings, self.test_runner) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/django/test/utils.py", line 394, in get_runner test_module = __import__(test_module_name, {}, {}, test_path[-1]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/django_coverage/coverage_runner.py", line 31, in <module> from django.db.models import get_app, get_apps ImportError: cannot import name 'get_app' from 'django.db.models' (/usr/local/lib/python3.11/site-packages/django/db/models/__init__.py)
解决方案
原因分析
get_app和get_apps在Django 3.2后被标记为废弃,Django 4.0+已完全移除这两个方法。你使用的django_coverage包依赖这些已废弃API,导致导入失败。
修复步骤
替换测试运行器
移除settings.py中TEST_RUNNER配置里的django_coverage.runner.CoverageRunner,恢复默认测试运行器,或配置为pytest_django.runner.DjangoTestRunner。改用pytest-cov执行测试
直接使用pytest命令替代django-admin test,通过已安装的pytest-cov生成覆盖率报告:pytest --cov=.清理旧依赖
卸载不再需要的django_coverage:pip uninstall django-coverage
补充说明
django_coverage已长时间未维护,无适配Django 4.1+的版本。优先迁移到pytest-cov更稳妥,它兼容新版本Django和Python,功能也更完善。
内容的提问来源于stack exchange,提问作者Andrei Lupuleasa
相关产品推荐
相关产品推荐

