如何序列化在Pydantic中扩展内置类型的自定义类型?
目前,我正在与Fastapi和Pydantic合作作为Serialializer。 问题是,我们在服务器端使用雪花ID,这意味着我们需要在发送到客户端之前将这些ID转换为字符串(JavaScript),因为ID大于JS的 max Safe Integer 。
因此,我尝试创建一个新类,该类别扩展了Python的INT类型,并自定义了它将如何序列化和应对序列化。这是我的代码:
class SnowflakeId(int):
@classmethod
def __get_validators__(cls):
yield cls.validate
@classmethod
def validate(cls, v: str):
return int(v)
@classmethod
def __modify_schema__(cls, field_schema: dict) -> None:
field_schema['type'] = 'string'
这是模型:
class BaseModel(pydantic.BaseModel):
__abstract__ = True
id: SnowflakeId
class Config:
orm_mode = True
arbitrary_types_allowed = True
json_encoders = {
SnowflakeId: lambda v: str(v)
}
alias_generator = camelize
allow_population_by_field_name = True
当从JSON字符串到INT ID的次要化时,它可以正常工作,但是,当涉及序列化时,输出仍然是整数。 我希望它也将ID序列化为字符串,是否有可能?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
是的!
json_encoders
是一个很好的尝试,但是在hood pydantic下调用json.dumps 。因此,对于可序列化类型(例如snowflakeid
),它不在乎其他json_encoders
。您可以做的是覆盖转储方法:
和
validate
返回snowflakeid
:Yes it is!
json_encoders
is a good try, however under the hood pydantic calls json.dumps. So for serializable types (like yourSnowflakeId
) it won't care about additionaljson_encoders
.What you can do is to override dumps method:
And let
validate
returnSnowflakeId
: