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

使用Django dumpdata和loaddata迁移数据时遭遇IntegrityError错误求助

解决Django loaddata时django_admin_log外键无效的问题

这个错误是典型的新旧项目django_content_type表记录不匹配导致的:
Django的django_content_type表会自动记录所有模型的元数据,每条记录的id是按模型迁移/创建的顺序生成的。旧项目django_admin_log里的content_type_id关联的是旧库中django_content_type的id,但新项目迁移后生成的content_type记录id大概率和旧库不一样,自然就找不到对应值了。

下面给你两种可行的解决办法:

方案1:用自然键导出导入(最稳妥)

自然键能让Django通过模型的app_label和model名称来匹配外键,而不是依赖自增的id,完美避开新旧库id不匹配的问题:

  1. 在旧项目导出数据
    执行命令时加上--natural-foreign参数,同时导出admin和contenttypes模块的数据(如果需要全量迁移就去掉指定模块):

    # 导出全量数据(排除自动生成的权限,避免冲突)
    python3 manage.py dumpdata --natural-foreign --exclude auth.permission --indent 2 > full_data.json
    
    # 或者只导出后台日志和对应的contenttype数据
    python3 manage.py dumpdata --natural-foreign admin contenttypes --indent 2 > admin_content_data.json
    
  2. 在新项目导入数据
    先确认新项目的模型和旧项目完全一致(包括app名称、模型字段、甚至模型定义的顺序),然后执行导入:

    python3 manage.py loaddata full_data.json
    # 或者对应上面的admin_content_data.json
    

方案2:清空新项目的contenttype和admin日志后导入

如果新项目已经生成了django_content_type记录,可以先清空相关表,再导入旧数据:

  1. 打开新项目的Django Shell

    python3 manage.py shell
    
  2. 执行清空操作
    在Shell里输入:

    from django.contrib.contenttypes.models import ContentType
    from django.contrib.admin.models import LogEntry
    
    # 先删admin日志(它依赖contenttype,必须先删)
    LogEntry.objects.all().delete()
    # 再删contenttype记录
    ContentType.objects.all().delete()
    
  3. 从旧项目导出数据
    在旧项目执行:

    python3 manage.py dumpdata admin contenttypes --indent 2 > admin_content_data.json
    
  4. 新项目导入数据

    python3 manage.py loaddata admin_content_data.json
    

重要提醒

  • 一定要保证新旧项目的模型结构完全一致,包括app的名称(app_label)、模型字段、甚至模型在文件中的定义顺序,否则contenttype的元数据还是会不匹配。
  • 不要导入auth.permission数据,因为权限是Django根据contenttype自动生成的,旧权限和新项目自动生成的会冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:55:22