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

Django模型迁移至本地PgSQL数据库报错求助

解决Django迁移时"relation does not exist"报错的问题

看起来你的问题出在Django执行makemigrations时,尝试访问一个还不存在的business_data_entry_taxon表——这通常是因为在模型初始化阶段(比如加载模型、admin配置或信号)有代码提前执行了数据库查询,而此时新数据库是空的,根本没有这张表。结合你的操作步骤,我整理了以下排查和解决方法:

一、先排查代码中提前触发数据库查询的部分

Django在运行makemigrations时会加载所有模型、admin配置和信号逻辑,如果这些代码里有直接查询数据库的操作,就会在表还未创建时报错:

  • 检查模型方法:比如Taxon或其他模型的__str__、自定义属性/方法里,是否有调用Taxon.objects.get(...)或关联表查询的逻辑。举个例子,如果你的__str__写了return f"{self.name_taxon} ({self.gi})"是没问题的,但如果写了return f"{self.name_taxon} ({self.some_related_model.name})"就会触发查询。
  • 检查Admin配置:打开admin.py,看是否有ModelAdmin的list_display、list_filter使用了跨表字段(比如fk_taxon__name_taxon),或者自定义的list_display方法里执行了数据库查询。
  • 检查信号逻辑:如果项目里用了Django signals,确认没有在post_migrate以外的信号(比如pre_save、post_save)里执行数据库查询——这些信号会在模型初始化时就触发。

二、彻底清理迁移相关的缓存和文件

虽然你删除了0001_initial.py,但残留的缓存文件可能导致Django读取旧的迁移信息:

  • 删除应用migrations目录下的所有迁移文件(保留__init__.py):
    rm business_data_entry/migrations/0*.py
    
  • 删除migrations目录下的__pycache__文件夹:
    rm -r business_data_entry/migrations/__pycache__
    
  • 同时清理项目根目录下的__pycache__文件夹,避免残留的迁移缓存。

三、重新执行迁移流程

在解决代码问题并清理完迁移文件后,按以下步骤操作:

  1. 确认新创建的jlb_inventory数据库是空的(可以用PostgreSQL命令行验证:\c jlb_inventory后执行\dt,应该没有任何表)。
  2. 生成新的迁移文件:
    python manage.py makemigrations business_data_entry
    
  3. 执行迁移创建数据表:
    python manage.py migrate
    

额外提示

如果你的项目包含多个应用,确保business_data_entry在settings.py的INSTALLED_APPS列表中,并且可以先单独迁移这个应用,避免其他应用的迁移依赖影响:

python manage.py migrate business_data_entry

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:26:43