使用Pydantic模型遇ValidationError错误,请求协助修复
Pydantic ValidationError 修复方案
问题原因
你的Data模型定义中,data字段是dict[str, Products]类型,这意味着data字典里的每个值都必须符合Products模型的结构——即必须包含一个名为products的键,对应的值是Item对象的列表。
但你传入的验证数据中,data的products键直接对应了一个Item列表,没有包裹成Products模型要求的结构,导致Pydantic无法将其解析为Products实例,从而抛出ValidationError。
修复方案
方案1:调整输入数据结构(推荐,符合原模型定义)
将data字典中的值调整为符合Products模型的结构,也就是每个值是包含products字段的字典:
from pydantic import BaseModel class Item(BaseModel): id: int brand: str class Products(BaseModel): products: list[Item] class Data(BaseModel): data: dict[str, Products] # 修复后的数据:data的value是符合Products结构的字典 d = Data.model_validate({'data': {'smartphones': {'products': [{'id': 1234, 'brand': 'infinix'}]}}}) print(d) # 输出:data={'smartphones': Products(products=[Item(id=1234, brand='infinix')])}
如果确实需要data的键为products,可以这样传入:
d = Data.model_validate({'data': {'products': {'products': [{'id': 1234, 'brand': 'infinix'}]}}})
方案2:修改模型定义(适配实际数据结构)
如果你的实际业务需求是Data的data字段直接对应Products的products列表,可以修改Data模型的定义:
from pydantic import BaseModel class Item(BaseModel): id: int brand: str class Products(BaseModel): products: list[Item] # 修改Data模型,data字段直接为Products类型 class Data(BaseModel): data: Products d = Data.model_validate({'data': {'products': [{'id': 1234, 'brand': 'infinix'}]}}) print(d) # 输出:data=Products(products=[Item(id=1234, brand='infinix')])
或者如果不需要Products中间层,直接简化模型:
from pydantic import BaseModel class Item(BaseModel): id: int brand: str class Data(BaseModel): data: list[Item] d = Data.model_validate({'data': [{'id': 1234, 'brand': 'infinix'}]}) print(d) # 输出:data=[Item(id=1234, brand='infinix')]
内容的提问来源于stack exchange,提问作者moris m
相关产品推荐
相关产品推荐

