含必填id字段的JSON经Pydantic验证时提示字段缺失的问题
问题分析与解决
你的代码问题出在实例化方式错误,不是字段定义的问题。
错误原因
你写的Event().model_validate_json(external_data)会先执行Event(),这一步会尝试创建一个没有传入任何参数的Event实例——但你的id是必填字段,这时候就已经触发了验证失败,后续的model_validate_json其实根本没正确处理外部JSON数据。错误提示里的input_value={}也能佐证这一点:验证时传入的是空字典,也就是你先创建空实例时的输入。
正确写法
直接通过Event类调用model_validate_json方法,不需要先实例化:
from pydantic import BaseModel class Event(BaseModel): id: str external_data = """ { "id": "abcdef", "status": "confirmed" } """ # 直接用类调用model_validate_json event = Event.model_validate_json(external_data) print(event) # 输出: id='abcdef'
另外两种等效的正确写法:
- 解析JSON后传给类构造函数:
import json event = Event(**json.loads(external_data))
- 使用
model_validate方法:
event = Event.model_validate(json.loads(external_data))
为什么改成id: str=None能运行?
当你把id设为可选(默认值None)时,Event()可以成功创建空实例(因为id不是必填了),之后调用model_validate_json会更新这个实例的字段值,所以不会报错。但这是绕开问题的写法,不是正确的解决方案——你的业务逻辑里id应该是必填的,所以不应该这么改。
内容的提问来源于stack exchange,提问作者hm-distro
相关产品推荐
相关产品推荐

