You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:12:47