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

Django dumpdata/loaddata报错:Key不存在于表中,求解决方法

问题:Django dumpdata导出数据后加载时出现外键约束错误

我尝试导出Postgres数据库数据并在本地加载,但遇到了外键约束错误。

模型定义

class User(AbstractUser):
    pass


class Profile(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        primary_key=True
    )
    dob = models.DateField(null=True, blank=True)

执行的导出代码

call_command('dumpdata', indent=4, exclude=['contenttypes', 'auth.Permission', 'sessions', 'admin.logentry'])

加载时的错误信息

django.db.utils.IntegrityError: Problem installing fixtures: insert or update on table "profiles_profile" violates foreign key constraint "profiles_profile_user_id_a3e81f91_fk_accounts_user_id"
DETAIL:  Key (user_id)=(1) is not present in table "accounts_user".

导出的fixture内容

{
    "model": "accounts.user",
    "fields": {
        "password": "xyz",
        "last_login": "2022-11-27T17:28:45.854Z",
        "is_superuser": true,
        "username": "JohnDoe",
        "first_name": "John",
        "last_name": "Doe",
        "is_staff": true,
        "is_active": true,
        "date_joined": "2020-09-02T16:28:13.329Z",
        "groups": [],
        "user_permissions": []
    }
},

{
    "model": "profiles.profile",
    "pk": 1,
    "fields": {
        "dob": "1980-06-20",
    }
},

这种情况正常吗?我还尝试在call_command中使用natural-foreign和natural-primary-keys参数,但没有效果。请问我哪里做错了?


解决方案

问题根源

  1. User数据缺失主键:AbstractUser默认主键是id,但dumpdata导出时未包含pk/id字段,导致加载时Django会自动生成新主键,而Profile的pk=1对应原User主键,新主键不匹配触发约束错误。
  2. Profile数据未正确关联外键:由于Profile把user设为主键,dumpdata导出时未在fields中保留user关联字段,仅用pk存储user_id,加载时Django无法识别该关联关系。

解决办法

  1. 调整dumpdata命令参数
    指定模型导出顺序(确保User先于Profile导出),同时保留natural-foreign和natural-primary参数:

    call_command(
        'dumpdata',
        'accounts.user',
        'profiles.profile',
        indent=4,
        exclude=['contenttypes', 'auth.Permission', 'sessions', 'admin.logentry'],
        natural_foreign=True,
        natural_primary=True
    )
    
  2. 手动修正fixture内容
    给User添加pk字段,给Profile的fields添加user关联字段(值为对应User的主键):

    {
        "model": "accounts.user",
        "pk": 1,
        "fields": {
            "password": "xyz",
            "last_login": "2022-11-27T17:28:45.854Z",
            "is_superuser": true,
            "username": "JohnDoe",
            "first_name": "John",
            "last_name": "Doe",
            "is_staff": true,
            "is_active": true,
            "date_joined": "2020-09-02T16:28:13.329Z",
            "groups": [],
            "user_permissions": []
        }
    },
    {
        "model": "profiles.profile",
        "fields": {
            "user": 1,
            "dob": "1980-06-20"
        }
    }
    
  3. 临时调整模型定义(测试环境适用)
    暂时移除Profile中user字段的primary_key=True,执行迁移后再导出数据,加载完成后恢复该配置并重新迁移。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:15:38