Functional Serializers
このモジュールには、シリアル化のための関連クラスと関数が含まれています。
PlainSerializer
dataclass
¶
PlainSerializer(
func: SerializerFunction,
return_type: Any = PydanticUndefined,
when_used: Literal[
"always", "unless-none", "json", "json-unless-none"
] = "always",
)
普通のシリアライザは、シリアライゼーションの出力を変更するために関数を使用します。
これは特に、アノテーション付き型のシリアライゼーションをカスタマイズしたい場合に役立ちます。
スペースで区切られた文字列にシリアライズされるlist
の入力を考えてみましょう。
from typing import List
from typing_extensions 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'}
Attributes:
Name | Type | Description |
---|---|---|
func |
SerializerFunction
|
シリアライザ関数。 |
return_type |
Any
|
関数の戻り型。省略した場合は、型注釈から推測されます。 |
when_used |
Literal['always', 'unless-none', 'json', 'json-unless-none']
|
このシリアライザをいつ使用すべきかを決定します。"always"、"unless-none"、"json"、"json-unless-none"の値を持つ文字列を受け入れます。デフォルトは"always"です。 |
WrapSerializer
dataclass
¶
WrapSerializer(
func: WrapSerializerFunction,
return_type: Any = PydanticUndefined,
when_used: Literal[
"always", "unless-none", "json", "json-unless-none"
] = "always",
)
ラップシリアライザは、標準のシリアライゼーションロジックを適用するハンドラ関数とともに生の入力を受け取り、シリアライゼーションの最終出力として返す前に、結果の値を変更できます。
例えば、ラップシリアライザがタイムゾーンをUTCに変換し、が既存のdatetime
シリアライゼーションロジックを利用するシナリオを考えてみましょう。
from datetime import datetime, timezone
from typing import Any, Dict
from typing_extensions import Annotated
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 `helper` 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"}}
'''
Attributes:
Name | Type | Description |
---|---|---|
func |
WrapSerializerFunction
|
ラップされるシリアライザ関数。 |
return_type |
Any
|
関数の戻り型。省略した場合は、型注釈から推測されます。 |
when_used |
Literal['always', 'unless-none', 'json', 'json-unless-none']
|
このシリアライザをいつ使用すべきかを決定します。"always"、"unless-none"、"json"、"json-unless-none"の値を持つ文字列を受け入れます。デフォルトは"always"です。 |
field_serializer ¶
field_serializer(
*fields: str,
mode: Literal["plain", "wrap"] = "plain",
return_type: Any = PydanticUndefined,
when_used: Literal[
"always", "unless-none", "json", "json-unless-none"
] = "always",
check_fields: bool | None = None
) -> Callable[[Any], Any]
カスタムフィールドのシリアル化を可能にするデコレータ。
以下の例では、重複を避けるためにset
型のフィールドが使用されています。field_serializer
はソートされたリストとしてデータをシリアライズするために使用されています。
from typing import Set
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"]}
詳細については、Custom serializerを参照してください。
4つのシグネチャがサポートされています。
(self, value: Any, info: FieldSerializationInfo)
(self, value: Any, nxt: SerializerFunctionWrapHandler, info: FieldSerializationInfo)
(value: Any, info: SerializationInfo)
(value: Any, nxt: SerializerFunctionWrapHandler, info: SerializationInfo)
Parameters:
Name | Type | Description | Default |
---|---|---|---|
fields |
str
|
メソッドが呼び出されるフィールド。 |
()
|
mode |
Literal['plain', 'wrap']
|
シリアライゼーションモード。
- |
'plain'
|
return_type |
Any
|
関数のオプションの戻り型です。省略した場合は、型アノテーションから推測されます。 |
PydanticUndefined
|
when_used |
Literal['always', 'unless-none', 'json', 'json-unless-none']
|
シリアライズに使用するシリアライザを指定します。 |
'always'
|
check_fields |
bool | None
|
フィールドがモデル上に実際に存在するかどうかをチェックするかどうか。 |
None
|
Returns:
Type | Description |
---|---|
Callable[[Any], Any]
|
デコレータ関数。 |
Source code in pydantic/functional_serializers.py
218 219 220 221 222 223 224 225 226 227 228 229 230 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 |
|
model_serializer ¶
model_serializer(
f: Callable[..., Any] | None = None,
/,
*,
mode: Literal["plain", "wrap"] = "plain",
when_used: Literal[
"always", "unless-none", "json", "json-unless-none"
] = "always",
return_type: Any = PydanticUndefined,
) -> Callable[[Any], Any]
カスタムモデルのシリアライゼーションを可能にするデコレータ。
これは、モデルをカスタマイズされた方法でシリアライズする必要がある場合に便利で、特定のフィールド以外にも柔軟性を持たせることができます。
たとえば、温度を摂氏などの同じ温度スケールに直列化することができます。
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}
詳細については、Custom serializerを参照してください。
Parameters:
Name | Type | Description | Default |
---|---|---|---|
f |
Callable[..., Any] | None
|
デコレートされる関数。 |
None
|
mode |
Literal['plain', 'wrap']
|
シリアライゼーションモード。
|
'plain'
|
when_used |
Literal['always', 'unless-none', 'json', 'json-unless-none']
|
このシリアライザをいつ使用すべきかを決定します。 |
'always'
|
return_type |
Any
|
関数の戻り型。省略した場合は、型注釈から推測されます。 |
PydanticUndefined
|
Returns:
Type | Description |
---|---|
Callable[[Any], Any]
|
デコレータ関数。 |
Source code in pydantic/functional_serializers.py
300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 |
|