运行pytest时触发Django ProgrammingError:关联关系不存在
解决 Django pytest 中出现的
django.db.utils.ProgrammingError: relation "" does not exist 错误 针对你遇到的这个错误,以下是几个可能的排查方向和解决办法:
1. 确认 Group 外键的引用正确性
你的 Account 模型中使用了 Group 外键,首先确保已正确导入 Django 内置的 Group 模型:
from django.contrib.auth.models import Group
如果导入路径错误,或者项目中存在自定义的 Group 模型但未正确配置,可能会导致 Django 无法解析关联的表名,进而出现空关系名的错误。
2. 检查 pytest 测试数据库的迁移状态
pytest-django 默认会为测试创建独立的数据库,但有时可能未自动应用迁移。可以尝试:
- 运行测试时添加
--create-db参数,强制重新创建测试数据库并应用所有迁移:pytest --create-db - 检查
pytest.ini或conftest.py中的配置,确保没有禁用迁移自动应用的设置。
3. 验证模型的表名生成逻辑
虽然你的模型没有定义 Meta 类,但 Django 会默认使用 app_label_modelname 作为表名。请确认:
- 包含
Account模型的应用已添加到settings.py的INSTALLED_APPS中; - 应用名称没有拼写错误,避免 Django 无法正确生成表名。
4. 排查自定义管理器或信号中的问题
你的 Account 模型使用了自定义的 AccountManager,检查管理器中是否有提前访问数据库的逻辑(比如在初始化时执行查询),这可能导致在测试数据库迁移完成前尝试访问表,引发错误。
另外,检查项目中是否有针对 Account 模型的信号,比如 post_save 或 pre_save,如果信号逻辑在表创建前执行,也可能触发该错误。
5. 彻底重置测试环境
即使你已经重置过迁移,尝试以下更彻底的步骤:
- 删除所有应用下的迁移文件(保留
__init__.py); - 手动删除测试数据库(如果使用 SQLite,直接删除
.db文件;如果是 PostgreSQL/MySQL,执行删库命令); - 重新生成迁移:
python manage.py makemigrations - 应用迁移到主数据库:
python manage.py migrate - 再次运行 pytest:
pytest
内容的提问来源于stack exchange,提问作者The Elif
相关产品推荐
相关产品推荐

