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

如何扁平化嵌套Pydantic模型,将嵌套字段转为字符串值?

解决方案

要让OrderItems实例化后category字段直接显示为字符串而非Category对象,有两种实用实现方式:

方法一:修改字段类型并添加输入验证器

直接将category字段类型改为str,通过字段验证器自动提取输入字典中的name值,从根源上把字段存储为字符串:

from typing import Union
from pydantic import BaseModel, Field, field_validator


class OrderItems(BaseModel):
    name: str = Field(alias="name")
    category: str = Field(alias="category")
    unit: Union[str, None] = Field(alias="unit")
    quantity: int = Field(alias="quantity")

    @field_validator('category', mode='before')
    def extract_category_name(cls, value):
        # 若输入是字典则提取name字段,已经是字符串则直接返回
        if isinstance(value, dict):
            return value.get('name')
        return value

实例化测试:

order = OrderItems(**{'name': 'Test','category':{'name': 'Test Cat'}, 'unit': 'kg', 'quantity': 10})
print(order)

输出结果:

OrderItems(name='Test', category='Test Cat', unit='kg', quantity=10)

方法二:重写模型的__repr__方法(仅改变显示形式)

如果需要保留category字段的Category类型,但只是希望打印/显示时呈现为字符串,可以重写模型的__repr__方法:

from typing import Union
from pydantic import BaseModel, Field


class Category(BaseModel):
    name: str = Field(alias="name")


class OrderItems(BaseModel):
    name: str = Field(alias="name")
    category: Category = Field(alias="category")
    unit: Union[str, None] = Field(alias="unit")
    quantity: int = Field(alias="quantity")

    def __repr__(self) -> str:
        return (f"OrderItems(name='{self.name}', category='{self.category.name}', "
                f"unit='{self.unit}', quantity={self.quantity})")

这种方式下,category实际存储的仍是Category对象,但打印时会显示对应的字符串名称。


内容的提问来源于stack exchange,提问作者Russell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 00:55:34