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参数,但没有效果。请问我哪里做错了?
解决方案
问题根源
- User数据缺失主键:
AbstractUser默认主键是id,但dumpdata导出时未包含pk/id字段,导致加载时Django会自动生成新主键,而Profile的pk=1对应原User主键,新主键不匹配触发约束错误。 - Profile数据未正确关联外键:由于Profile把
user设为主键,dumpdata导出时未在fields中保留user关联字段,仅用pk存储user_id,加载时Django无法识别该关联关系。
解决办法
调整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 )手动修正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" } }临时调整模型定义(测试环境适用)
暂时移除Profile中user字段的primary_key=True,执行迁移后再导出数据,加载完成后恢复该配置并重新迁移。
内容的提问来源于stack exchange,提问作者OhMad
相关产品推荐
相关产品推荐

