You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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,导致导入失败。

修复步骤

  1. 替换测试运行器
    移除settings.py中TEST_RUNNER配置里的django_coverage.runner.CoverageRunner,恢复默认测试运行器,或配置为pytest_django.runner.DjangoTestRunner。

  2. 改用pytest-cov执行测试
    直接使用pytest命令替代django-admin test,通过已安装的pytest-cov生成覆盖率报告:

    pytest --cov=.
    
  3. 清理旧依赖
    卸载不再需要的django_coverage:

    pip uninstall django-coverage
    

补充说明

django_coverage已长时间未维护,无适配Django 4.1+的版本。优先迁移到pytest-cov更稳妥,它兼容新版本Django和Python,功能也更完善。

内容的提问来源于stack exchange,提问作者Andrei Lupuleasa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:39:34