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

Django fixtures/loaddata中自定义CharField主键时id与pk的差异问题

Django自定义CharField主键fixture加载异常问题解答

核心原因

Django的JSON fixture格式有固定的结构规范,主键值必须定义在顶级的pk字段下,和模型主键的实际命名无关。

异常现象成因

  • 你之前把主键值放在顶级的id字段下时,loaddata命令不会把这个字段识别为主键赋值,只会默认读取fields字典内的字段值和顶级的pk值。由于两个fixture条目都没有提供有效的主键值,Django会默认给主键字段赋值为空字符串。
  • 两个条目主键都是空字符串,写入数据库时会触发主键唯一约束,后写入的条目会覆盖先写入的,所以最终数据库里只剩最后一条数据,且主键为空。这也导致admin后台删除时无法匹配到对应主键的记录,所以删除无响应。

解决方案说明

你将顶级键改为pk后,loaddata会自动将pk对应的值映射到模型中设置了primary_key=True的字段(也就是你自定义的id字段),主键值可以正常写入,不会出现冲突和空值的问题。
除了用顶级pk的写法之外,你也可以把主键值放在fields字典内,和普通字段一样定义,写法如下:

[
  {
    "model": "products.product",
    "fields": {
      "id": "am11",
      "title": "Test Product A"
    }
  },
  {
    "model": "products.product",
    "fields": {
      "id": "am22",
      "title": "Test Product B"
    }
  }
]

这种写法也可以正常加载数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:57:04