函数式序列化器
此模块包含与序列化相关的类和函数。
FieldPlainSerializer module-attribute
¶
FieldPlainSerializer: TypeAlias = (
"core_schema.SerializerFunction | _Partial"
)
以 plain
模式运行的字段序列化器方法或函数。
FieldWrapSerializer module-attribute
¶
FieldWrapSerializer: TypeAlias = (
"core_schema.WrapSerializerFunction | _Partial"
)
以 wrap
模式运行的字段序列化器方法或函数。
FieldSerializer module-attribute
¶
FieldSerializer: TypeAlias = (
"FieldPlainSerializer | FieldWrapSerializer"
)
一个字段序列化器方法或函数。
ModelPlainSerializerWithInfo module-attribute
¶
以 plain
模式运行且带 info
参数的模型序列化器方法。
ModelPlainSerializerWithoutInfo module-attribute
¶
以 plain
模式运行且不带 info
参数的模型序列化器方法。
ModelPlainSerializer module-attribute
¶
ModelPlainSerializer: TypeAlias = (
"ModelPlainSerializerWithInfo | ModelPlainSerializerWithoutInfo"
)
以 plain
模式运行的模型序列化器方法。
ModelWrapSerializerWithInfo module-attribute
¶
ModelWrapSerializerWithInfo: TypeAlias = Callable[
[
Any,
SerializerFunctionWrapHandler,
SerializationInfo[Any],
],
Any,
]
以 wrap
模式运行且带 info
参数的模型序列化器方法。
ModelWrapSerializerWithoutInfo module-attribute
¶
以 wrap
模式运行且不带 info
参数的模型序列化器方法。
ModelWrapSerializer module-attribute
¶
ModelWrapSerializer: TypeAlias = (
"ModelWrapSerializerWithInfo | ModelWrapSerializerWithoutInfo"
)
以 wrap
模式运行的模型序列化器方法。
PlainSerializer dataclass
¶
PlainSerializer(
func: SerializerFunction,
return_type: Any = PydanticUndefined,
when_used: WhenUsed = "always",
)
Plain 序列化器使用函数来修改序列化的输出。
当您想为带注解的类型定制序列化时,这特别有用。考虑一个 list
输入,它将被序列化为一个以空格分隔的字符串。
from typing import Annotated
from pydantic import BaseModel, PlainSerializer
CustomStr = Annotated[
list, PlainSerializer(lambda x: ' '.join(x), return_type=str)
]
class StudentModel(BaseModel):
courses: CustomStr
student = StudentModel(courses=['Math', 'Chemistry', 'English'])
print(student.model_dump())
#> {'courses': 'Math Chemistry English'}
属性
名称 | 类型 | 描述 |
---|---|---|
func |
SerializerFunction
|
序列化器函数。 |
return_type |
Any
|
函数的返回类型。如果省略,将从类型注解中推断。 |
when_used |
WhenUsed
|
确定何时使用此序列化器。接受一个字符串,其值为 |
WrapSerializer dataclass
¶
WrapSerializer(
func: WrapSerializerFunction,
return_type: Any = PydanticUndefined,
when_used: WhenUsed = "always",
)
Wrap 序列化器接收原始输入以及一个处理函数,该处理函数应用标准序列化逻辑,并在返回最终序列化输出之前修改结果值。
例如,这是一个场景,其中一个 wrap 序列化器将时区转换为 UTC 并 利用现有的 datetime
序列化逻辑。
from datetime import datetime, timezone
from typing import Annotated, Any
from pydantic import BaseModel, WrapSerializer
class EventDatetime(BaseModel):
start: datetime
end: datetime
def convert_to_utc(value: Any, handler, info) -> dict[str, datetime]:
# Note that `handler` can actually help serialize the `value` for
# further custom serialization in case it's a subclass.
partial_result = handler(value, info)
if info.mode == 'json':
return {
k: datetime.fromisoformat(v).astimezone(timezone.utc)
for k, v in partial_result.items()
}
return {k: v.astimezone(timezone.utc) for k, v in partial_result.items()}
UTCEventDatetime = Annotated[EventDatetime, WrapSerializer(convert_to_utc)]
class EventModel(BaseModel):
event_datetime: UTCEventDatetime
dt = EventDatetime(
start='2024-01-01T07:00:00-08:00', end='2024-01-03T20:00:00+06:00'
)
event = EventModel(event_datetime=dt)
print(event.model_dump())
'''
{
'event_datetime': {
'start': datetime.datetime(
2024, 1, 1, 15, 0, tzinfo=datetime.timezone.utc
),
'end': datetime.datetime(
2024, 1, 3, 14, 0, tzinfo=datetime.timezone.utc
),
}
}
'''
print(event.model_dump_json())
'''
{"event_datetime":{"start":"2024-01-01T15:00:00Z","end":"2024-01-03T14:00:00Z"}}
'''
属性
名称 | 类型 | 描述 |
---|---|---|
func |
WrapSerializerFunction
|
要包装的序列化器函数。 |
return_type |
Any
|
函数的返回类型。如果省略,将从类型注解中推断。 |
when_used |
WhenUsed
|
确定何时使用此序列化器。接受一个字符串,其值为 |
field_serializer ¶
field_serializer(
*fields: str,
mode: Literal["plain", "wrap"] = "plain",
return_type: Any = PydanticUndefined,
when_used: WhenUsed = "always",
check_fields: bool | None = None
) -> (
Callable[[_FieldWrapSerializerT], _FieldWrapSerializerT]
| Callable[
[_FieldPlainSerializerT], _FieldPlainSerializerT
]
)
启用自定义字段序列化的装饰器。
在下面的示例中,使用 set
类型的字段来减少重复。field_serializer
用于将数据序列化为排序列表。
from pydantic import BaseModel, field_serializer
class StudentModel(BaseModel):
name: str = 'Jane'
courses: set[str]
@field_serializer('courses', when_used='json')
def serialize_courses_in_order(self, courses: set[str]):
return sorted(courses)
student = StudentModel(courses={'Math', 'Chemistry', 'English'})
print(student.model_dump_json())
#> {"name":"Jane","courses":["Chemistry","English","Math"]}
有关更多信息,请参阅用法文档。
支持四种签名
(self, value: Any, info: FieldSerializationInfo)
(self, value: Any, nxt: SerializerFunctionWrapHandler, info: FieldSerializationInfo)
(value: Any, info: SerializationInfo)
(value: Any, nxt: SerializerFunctionWrapHandler, info: SerializationInfo)
参数
名称 | 类型 | 描述 | 默认值 |
---|---|---|---|
fields
|
str
|
应调用该方法的字段。 |
()
|
mode
|
Literal['plain', 'wrap']
|
序列化模式。
|
'plain'
|
return_type
|
Any
|
函数的可选返回类型,如果省略,将从类型注解中推断。 |
PydanticUndefined
|
when_used
|
WhenUsed
|
确定序列化器何时用于序列化。 |
'always'
|
check_fields
|
bool | None
|
是否检查模型上实际存在这些字段。 |
None
|
返回
类型 | 描述 |
---|---|
Callable[[_FieldWrapSerializerT], _FieldWrapSerializerT] | Callable[[_FieldPlainSerializerT], _FieldPlainSerializerT]
|
装饰器函数。 |
源代码在 pydantic/functional_serializers.py
中
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 |
|
model_serializer ¶
model_serializer(
f: _ModelPlainSerializerT,
) -> _ModelPlainSerializerT
model_serializer(
f: (
_ModelPlainSerializerT
| _ModelWrapSerializerT
| None
) = None,
/,
*,
mode: Literal["plain", "wrap"] = "plain",
when_used: WhenUsed = "always",
return_type: Any = PydanticUndefined,
) -> (
_ModelPlainSerializerT
| Callable[
[_ModelWrapSerializerT], _ModelWrapSerializerT
]
| Callable[
[_ModelPlainSerializerT], _ModelPlainSerializerT
]
)
启用自定义模型序列化的装饰器。
当模型需要以自定义方式序列化时,这非常有用,允许超越特定字段的灵活性。
一个例子是将温度序列化为相同的温度刻度,例如摄氏度。
from typing import Literal
from pydantic import BaseModel, model_serializer
class TemperatureModel(BaseModel):
unit: Literal['C', 'F']
value: int
@model_serializer()
def serialize_model(self):
if self.unit == 'F':
return {'unit': 'C', 'value': int((self.value - 32) / 1.8)}
return {'unit': self.unit, 'value': self.value}
temperature = TemperatureModel(unit='F', value=212)
print(temperature.model_dump())
#> {'unit': 'C', 'value': 100}
对于 mode='plain'
(默认值)支持两种签名
(self)
(self, info: SerializationInfo)
以及对于 mode='wrap'
的另外两种签名
(self, nxt: SerializerFunctionWrapHandler)
-
(self, nxt: SerializerFunctionWrapHandler, info: SerializationInfo)
有关更多信息,请参阅用法文档。
参数
名称 | 类型 | 描述 | 默认值 |
---|---|---|---|
f
|
_ModelPlainSerializerT | _ModelWrapSerializerT | None
|
要装饰的函数。 |
None
|
mode
|
Literal['plain', 'wrap']
|
序列化模式。
|
'plain'
|
when_used
|
WhenUsed
|
确定何时使用此序列化器。 |
'always'
|
return_type
|
Any
|
函数的返回类型。如果省略,将从类型注解中推断。 |
PydanticUndefined
|
返回
类型 | 描述 |
---|---|
_ModelPlainSerializerT | Callable[[_ModelWrapSerializerT], _ModelWrapSerializerT] | Callable[[_ModelPlainSerializerT], _ModelPlainSerializerT]
|
装饰器函数。 |
源代码在 pydantic/functional_serializers.py
中
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 |
|