在Pydantic中,我想将项目列表表示为词典.在该词典中,我希望键是该条目的id,该条目是该词典的键. 我阅读了SerializationMapping typesSequences上的文档.

然而,我没有找到创建这样的表示的方法.

我希望我的api中的这些内容能够从生成的api客户端轻松访问.

class Item(BaseModel):
    uid: UUID = Field(default_factory=uuid4)
    updated: datetime = Field(default_factory=datetime_now)
    ...


class ResponseModel:
    ...


print ResponseModel.model_dump()
#> {
        "67C812D7-B039-433C-B925-CA21A1FBDB23": {
            "uid": "67C812D7-B039-433C-B925-CA21A1FBDB23", 
            "updated": "2024-05-02 20:24:00"
        },{
        "D39A8EF1-E520-4946-A818-9FA8664F63F6": {
            "uid": "D39A8EF1-E520-4946-A818-9FA8664F63F6",
            "updated":"2024-05-02 20:25:00"
        }
    }

推荐答案

您可以使用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",
#     },
# }

Python相关问答推荐

双情节在单个图上切换-pPython

如何将Pydantic URL验证限制为特定主机或网站

已安装' owiener ' Python模块,但在导入过程中始终没有名为owiener的模块

如何在Pygame中绘制右对齐的文本?

Snap 7- read_Area用于类似地址的变量

除了Python之外,可以替代bare?

如何在不使用字符串的情况下将namedtuple属性传递给方法?

telegram 机器人API setMyName不起作用

不允许AMBIMA API请求方法

opencv Python稳定的图标识别

Pydantic:如何将对象列表表示为dict(将列表序列化为dict)

使文本输入中的文本与标签中的文本相同

比较两个二元组列表,NP.isin

使用LineConnection动画1D数据

为什么带有dropna=False的groupby会阻止后续的MultiIndex.dropna()工作?

Pandas—合并数据帧,在公共列上保留非空值,在另一列上保留平均值

对象的`__call__`方法的setattr在Python中不起作用'

Pandas计数符合某些条件的特定列的数量

Python中的变量每次增加超过1

如何使用SentenceTransformers创建矢量嵌入?