Pydantic从字典初始化模型时子模型被设为None的问题
问题原因与解决方案
核心问题
你为service_order_items字段设置了别名service_order_item,但在Pydantic V2中,字段指定别名后默认仅支持通过别名传递值。你的字典使用的是字段名service_order_items而非别名,再加上模型Config未开启populate_by_name=True,导致Pydantic无法将字典中的值映射到该字段,最终字段保留默认的None。
解决方案
方案1:开启字段名赋值支持
在模型的Config类中添加populate_by_name=True,允许同时通过字段名和别名给字段赋值:
class ServiceOrderModel(BaseModel): service_order_id: int | None = None service_order_number: str | None = None service_order_items: Optional[List[ServiceOrderItemModel]] = Field( None, alias="service_order_item" ) class Config: from_attributes = True populate_by_name = True # 新增配置项
方案2:调整字典键为别名
修改字典的键名,使其与模型定义的别名一致:
# 将字典中的"service_order_items"键替换为别名"service_order_item" service_order_dict["service_order_item"] = service_order_dict.pop("service_order_items") # 重新初始化模型 service_order_model = ServiceOrderModel(**service_order_dict)
方案3:移除别名配置
如果不需要别名,直接删除字段的alias参数,让字段名与字典键直接对应:
class ServiceOrderModel(BaseModel): service_order_id: int | None = None service_order_number: str | None = None # 移除alias参数,使用默认字段名匹配 service_order_items: Optional[List[ServiceOrderItemModel]] = None class Config: from_attributes = True
补充说明
如果是与SQLAlchemy结合使用,需确保Pydantic模型的字段/别名与ORM模型的字段名对应:
- 若ORM模型中该关联字段是单数
service_order_item,推荐使用方案1,既保留别名适配ORM,又支持字段名赋值; - 若ORM模型中也是复数
service_order_items,则方案3更简洁直接。
内容的提问来源于stack exchange,提问作者Masterstack8080
相关产品推荐
相关产品推荐

