如何在 pydantic 模式验证后从蛇案例转变成骆驼案例

时间:2021-06-16 02:09:38

标签: python pydantic

我可以找到一种方法,通过使用别名生成器将基于驼峰类型的请求正文转换为蛇型,但对于我的响应,我再次想将蛇型类型转换为驼峰型,然后提交到架构验证。有什么办法可以做到这一点吗?

示例: 我确实有一个 python 字典,如下所示,

{
 "title_name": "search001",
 "status_type": "New" 
}

并发布到 pydantic 模式验证,我的 dict 应将蛇形大小写类型转换为驼色大小写,如下所示,

{
 "titleName": "search001",
 "statusType": "New" 
}

如何定义pydantic schema来解决上述问题?

提前致谢。

2 个答案:

答案 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'}