
在 Pydantic V2 中,处理联合类型(Union Type)时,如果不同的模型具有相似的结构,Pydantic 可能会因为缺少足够的信息而无法正确地解析 JSON 数据。例如,当两个模型都包含一个列表类型的 items 字段,且没有其他明确的区分标志时,Pydantic 可能会错误地将数据解析为其中一个模型。为了解决这个问题,可以使用区分器(Discriminator)来明确指定用于区分不同模型的字段。
区分器(Discriminator)的作用
区分器是一个字段,它的值可以用来确定应该使用联合类型中的哪个模型来解析数据。通过在 Pydantic 模型中指定区分器,可以确保数据被正确地解析为预期的类型。
如何使用区分器
以下是一个示例,展示了如何在 Pydantic V2 中使用区分器:
广告联盟系统: 快速低成本建立您自己的广告联盟中易广告联盟程序是一套适合大型广告联盟系统,结合了盈众科技多年来的联盟系统研发经验,大量各行业广告商和上千家联盟合作的服务经验,精心打造的功能强大、性能卓越的广告联盟系统,支持CPC、CPM、CPS CPA、CPV、富媒体,抗负载性和稳定性极强,实际使用中的单服务器日流量可以达到3000万。 负载能力强,稳定地区,行业等定向超强防作弊技术广告分组计划云
2
import datetime
from typing import Annotated, Union, List, Literal
import pydantic
from pydantic import Field
class MealsService(pydantic.BaseModel):
class MealItem(pydantic.BaseModel):
course: str
name: str
quantity: int
unitPrice: float | None
type: Literal['meals'] = "meals"
items: list[MealItem]
time: datetime.time | None
class CanapesService(pydantic.BaseModel):
class CanapeItem(pydantic.BaseModel):
name: str
quantity: int
unitPrice: float | None
type: Literal['canapes'] = "canapes"
items: list[CanapeItem]
time: datetime.time | None
Services = Annotated[Union[MealsService, CanapesService], Field(discriminator='type')]
class Event(pydantic.BaseModel):
services: List[Services]
# 示例 JSON 数据
data = {
"services": [
{
"type": "canapes",
"items": [],
"time": None
}
]
}
# 解析 JSON 数据
event = Event(**data)
# 打印解析结果
print(event)代码解释:
注意事项:
总结:
通过使用区分器,可以解决 Pydantic 在解析联合类型时可能出现的歧义问题,确保数据被正确地解析为预期的模型。这种方法在处理具有相似结构的多个模型时非常有用,可以提高数据解析的准确性和可靠性。 在定义 Pydantic 模型时,合理利用 Literal 类型,可以进一步约束字段的取值范围,增强模型的健壮性。
以上就是使用 Pydantic V2 实现带区分器的联合类型的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号