我有一个 Pydantic 模型,其中包含自定义数据 tpye(特别是
quantiphy.Quantity
):
from pydantic import BaseModel
class SpecLimit(BaseModel):
label: str
minimum: Quantity | None = None
maximum: Quantity | None = None
typical: Quantity | None = None
is_informative: bool = False
我希望 Pydantic 将
Quantity
对象序列化为字符串(并从字符串中反序列化它们),但我不知道如何实现。我总是最终得到:
pydantic.errors.PydanticSchemaGenerationError: Unable to generate pydantic-core schema for <class 'quantiphy.quantiphy.Quantity'>...
我尝试指定
json_encoder
,但这不起作用,并且 json_encoders
属性已弃用。
from pydantic import BaseModel as _BaseModel
from quantiphy import Quantity
class BaseModel(_BaseModel):
class Config:
json_encoders = {
Quantity: str,
}
class SpecLimit(BaseModel):
label: str
minimum: Quantity | None = None
maximum: Quantity | None = None
typical: Quantity | None = None
is_informative: bool = False
Pydantic 模块的一大特色是,当您尝试使用
BaseModel
或 spec_limit.dict()
(对于较新的 pydantic 版本)将 spec_limit.model_dump()
类转换为字典时,pydantic 类 spec_limit
会将自身转换为字典 递归 ,这意味着您也可以将内部类 Quantity
设为 pydantic 基础模型,并且它会起作用。
请注意,如果在
Quantity
类中您有更多自定义类,它们也需要是 pydantic 基础模型。
所以这个问题的一般解决方案是:
class CustomizedClass(BaseModel):
# some data...
class MyBaseModelClass(BaseModel):
data: CustomizedClass
# Can use the dictionary for json format
MyBaseModelClass.model_dump()