我可以找到一种方法,通过使用别名生成器将基于驼峰类型的请求正文转换为蛇型,但对于我的响应,我再次想将蛇型类型转换为驼峰型,然后提交到架构验证。有什么办法可以做到这一点吗?
示例: 我确实有一个 python 字典,如下所示,
{
"title_name": "search001",
"status_type": "New"
}
并发布到 pydantic 模式验证,我的 dict 应将蛇形大小写类型转换为驼色大小写,如下所示,
{
"titleName": "search001",
"statusType": "New"
}
如何定义pydantic schema来解决上述问题?
提前致谢。
答案 0 :(得分:2)
我强烈建议你可以试试这个。使用 marshmallow
。
from marshmallow import Schema, fields
def camelcase(s):
parts = iter(s.split("_"))
return next(parts) + "".join(i.title() for i in parts)
class CamelCaseSchema(Schema):
"""Schema that uses camel-case for its external representation
and snake-case for its internal representation.
"""
def on_bind_field(self, field_name, field_obj):
field_obj.data_key = camelcase(field_obj.data_key or field_name)
# -----------------------------------------------------------------------------
class UserSchema(CamelCaseSchema):
first_name = fields.Str(required=True)
last_name = fields.Str(required=True)
schema = UserSchema()
loaded = schema.load({"firstName": "David", "lastName": "Bowie"})
print(loaded) # => {'last_name': 'Bowie', 'first_name': 'David'}
dumped = schema.dump(loaded)
print(dumped) # => {'lastName': 'Bowie', 'firstName': 'David'}
您可以在文档中了解更多信息 https://marshmallow.readthedocs.io/en/stable/examples.html
答案 1 :(得分:1)
您可以使用Alias Generator
from pydantic import BaseModel
def to_snake_case(string: str) -> str:
return ''.join(['_' + i.lower() if i.isupper() else i for i in string]).lstrip('_')
class MyModel(BaseModel):
titleName: str
statusType: str
class Config:
alias_generator = to_snake_case
data = {
"title_name": "search001",
"status_type": "New"
}
print(MyModel(**data).dict()) # {'titleName': 'search001', 'statusType': 'New'}