您可以使用PlainSerializer
(docs)更改字段的序列化,例如,要更改日期时间的所需输出格式:
from pydantic import Field, BaseModel, PlainSerializer
from uuid import UUID, uuid4
from datetime import datetime
from typing import Annotated
CustomUUID = Annotated[
UUID, PlainSerializer(lambda v: str(v), return_type=str)
]
CustomDatetime = Annotated[
datetime,
PlainSerializer(
lambda v: v.strftime("%Y-%m-%d %H:%M:%S"), return_type=str
),
]
class Item(BaseModel):
uid: CustomUUID = Field(default_factory=uuid4)
updated: CustomDatetime = Field(default_factory=datetime.now)
Item().model_dump()
# {'uid': '7b2b8e32-15c7-48b8-9ddb-2d25cc61bc61',
# 'updated': '2024-05-03 00:13:38'}
然后您可以使用model_serializer
(docs)来序列化ResponseModel
:
from pydantic import Field, BaseModel, model_serializer, PlainSerializer
from uuid import UUID, uuid4
from datetime import datetime
from typing import Annotated
CustomUUID = Annotated[
UUID, PlainSerializer(lambda v: str(v), return_type=str)
]
CustomDatetime = Annotated[
datetime,
PlainSerializer(
lambda v: v.strftime("%Y-%m-%d %H:%M:%S"), return_type=str
),
]
class Item(BaseModel):
uid: CustomUUID = Field(default_factory=uuid4)
updated: CustomDatetime = Field(default_factory=datetime.now)
class ResponseModel(BaseModel):
items: list[Item]
@model_serializer
def serialize_model(self):
return {str(item.uid): item.model_dump() for item in self.items}
ResponseModel(items=[Item() for i in range(2)]).model_dump()
# {
# "e41c4446-60e3-45c5-ab0a-a25f15febac4": {
# "uid": "e41c4446-60e3-45c5-ab0a-a25f15febac4",
# "updated": "2024-05-03 00:14:58",
# },
# "e07d4152-755a-4a0f-9312-29d343bda883": {
# "uid": "e07d4152-755a-4a0f-9312-29d343bda883",
# "updated": "2024-05-03 00:14:58",
# },
# }