Django实现颜色CRUD插入操作报错:期望pk值却收到字符串
问题现象
开发颜色模块CRUD功能时,插入数据触发如下校验错误:
{'color_name': [ErrorDetail(string='Incorrect type. Expected pk value, received str.', code='incorrect_type')]}
故障原因
错误本质是模型字段定义和业务需求不匹配:
- 你的
Colors模型中color_name被定义为关联Products模型的外键,Django REST Framework序列化器对外键字段默认仅接收关联对象的主键值(一般为整数ID),但前端表单提交的是用户输入的字符串类型颜色名称,类型校验直接失败。 - 结合表单设计和展示逻辑判断,
color_name的业务用途是存储颜色名称文本,并非关联产品的外键,属于字段类型定义错误。
修复方案
按以下步骤调整即可解决问题:
- 修正模型字段定义:将错误的外键字段替换为字符字段,适配存储颜色名称的需求,修改后模型代码如下:
class Colors(models.Model): # 移除错误的ForeignKey定义,使用CharField存储颜色名称 color_name = models.CharField(max_length=30) color_description = models.CharField(max_length=10) isactive = models.BooleanField(default=True)
- 同步数据库结构:在项目根目录执行迁移命令,把字段变更同步到数据库:
python manage.py makemigrations python manage.py migrate
- 校验逻辑适配:修改完成后,前端提交的字符串类型颜色名称可以正常通过序列化器校验并存入数据库;现有展示页模板中
{{result.color_name}}的取值逻辑无需修改,可直接正常展示颜色名称。 - 清理冗余代码:现有插入视图的GET分支中,传入空字典调用序列化器校验的逻辑无实际业务作用,可以直接删除,仅保留渲染表单页面的逻辑即可,避免生成无意义的错误日志。
内容的提问来源于stack exchange,提问作者Ameya Potdar
相关产品推荐
相关产品推荐

