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
相关产品推荐
相关产品推荐

