如何修复Django serializers字段必填校验报错问题
问题修复方案
你遇到的所有必填字段同时提示缺失的问题,90%以上是请求格式不匹配导致,同时代码中存在多个逻辑错误会导致后续运行失败,按以下步骤修复即可:
1. 优先检查请求发送配置
- 如果你用接口测试工具(Postman、Apifox等)测试:
- 确认请求方法为POST,地址匹配
register_user/ - 请求Body选择raw格式,子类型选择JSON,不要使用form-data/x-www-form-urlencoded格式(除非你单独配置了DRF的表单解析器)
- 检查请求头中自动携带了
Content-Type: application/json - 确认请求体中的字段名和序列化器定义的字段完全一致(大小写敏感),示例请求体参考:
{ "user_name": "testuser", "email": "test@example.com", "company": "test company", "state": "test state", "city": "test city", "address": "test address", "phone_number": "13800000000", "password": "testpass123", "password_2": "testpass123", "license_number": "test123" } - 确认请求方法为POST,地址匹配
- 如果你是用前端代码发请求:
- 确认请求头显式设置了
Content-Type: application/json - 确认提交的数据是JSON序列化后的字符串,不是FormData对象
- 确认请求头显式设置了
2. 修复代码中的逻辑错误
2.1 修复序列化器密码校验错误
当前你把password_2的取值写错成了取password的值,永远不会触发密码不一致的校验,修改serializers.py中的对应代码:
# 错误写法 password = self.validated_data["password"] password_2 = self.validated_data["password"] # 正确写法 password = self.validated_data["password"] password_2 = self.validated_data["password_2"]
2.2 处理license_number字段缺失问题
你的UserBase模型中定义的license_number字段没有设置null=True和blank=True,默认是必填字段,但序列化器的fields列表中没有包含该字段,会导致模型保存时报错,二选一修复:
- 若注册时需要用户提交许可证号:把
'license_number'添加到序列化器的fields列表中 - 若注册时不需要用户提交:修改
models.py中license_number字段定义为:license_number = models.CharField(max_length=50, blank=True, null=True)
2.3 修复序列化器重复字段
你的序列化器fields列表中重复写了两次first_name,删掉多余的一个即可。
2.4 修复模型Meta类语法错误
UserBase的Meta类中verbose_name用了冒号赋值,修改为等号:
class Meta: verbose_name = 'Accounts' verbose_name_plural = 'Accounts'
内容的提问来源于stack exchange,提问作者C-Bizz
相关产品推荐
相关产品推荐

