如何从蛇案例转变为骆驼案例 post pydantic 模式验证
How to inflect from snake case to camel case post the pydantic schema validations
我可以找到一种方法,使用 Alias Generator 将基于 camelcase 类型的请求正文转换为 snake case one,但是对于我的响应,我再次想将 snake case 类型转换为 camel case 类型 post到架构验证。有什么办法可以实现吗?
示例:
我确实有一个 python 字典,如下所示,
{
"title_name": "search001",
"status_type": "New"
}
并且 post 到 pydantic 模式验证我的字典应该将蛇形大小写类型转换为驼峰大小写,如下所示,
{
"titleName": "search001",
"statusType": "New"
}
如何定义一个 pydantic 模式来解决上述问题?
提前致谢。
我强烈推荐你可以试试 this.Using 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
您可以使用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'}
您可以在 .json
或 .dict
:
中结合使用别名生成器和 kwarg by_alias
from pydantic import BaseModel,Field
def to_camel(string: str) -> str:
string_split = string.split('_')
return string_split[0]+''.join(word.capitalize() for word in string_split[1:])
class Foo(BaseModel):
title_name:str
status_type:str
class Config:
alias_generator = to_camel
f = Foo.parse_raw("""
{
"titleName": "search001",
"statusType": "New"
}
""")
print(f) # title_name='search001' status_type='New'
print(f.json(by_alias=True)) # {"titleName": "search001", "statusType": "New"}
print(f.json()) # {"title_name": "search001", "status_type": "New"}
另外,你可以在Config
中加上allow_population_by_field_name=True
class 这样你就可以parse/initialize model 的原始字段名或别名
如果您使用的是 fastapi,则可以按如下方式利用 fastapi_camelcase 包:
import uvicorn
from fastapi import FastAPI
from fastapi_camelcase import CamelModel
class User(CamelModel):
first_name: str
last_name: str
age: int
app = FastAPI()
@app.get("/user/get", response_model=User)
async def get_user():
return User(first_name="John", last_name="Doe", age=30)
@app.post("/user/create", response_model=User)
async def create_user(user: User):
return user
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
我可以找到一种方法,使用 Alias Generator 将基于 camelcase 类型的请求正文转换为 snake case one,但是对于我的响应,我再次想将 snake case 类型转换为 camel case 类型 post到架构验证。有什么办法可以实现吗?
示例: 我确实有一个 python 字典,如下所示,
{
"title_name": "search001",
"status_type": "New"
}
并且 post 到 pydantic 模式验证我的字典应该将蛇形大小写类型转换为驼峰大小写,如下所示,
{
"titleName": "search001",
"statusType": "New"
}
如何定义一个 pydantic 模式来解决上述问题?
提前致谢。
我强烈推荐你可以试试 this.Using 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
您可以使用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'}
您可以在 .json
或 .dict
:
from pydantic import BaseModel,Field
def to_camel(string: str) -> str:
string_split = string.split('_')
return string_split[0]+''.join(word.capitalize() for word in string_split[1:])
class Foo(BaseModel):
title_name:str
status_type:str
class Config:
alias_generator = to_camel
f = Foo.parse_raw("""
{
"titleName": "search001",
"statusType": "New"
}
""")
print(f) # title_name='search001' status_type='New'
print(f.json(by_alias=True)) # {"titleName": "search001", "statusType": "New"}
print(f.json()) # {"title_name": "search001", "status_type": "New"}
另外,你可以在Config
中加上allow_population_by_field_name=True
class 这样你就可以parse/initialize model 的原始字段名或别名
如果您使用的是 fastapi,则可以按如下方式利用 fastapi_camelcase 包:
import uvicorn
from fastapi import FastAPI
from fastapi_camelcase import CamelModel
class User(CamelModel):
first_name: str
last_name: str
age: int
app = FastAPI()
@app.get("/user/get", response_model=User)
async def get_user():
return User(first_name="John", last_name="Doe", age=30)
@app.post("/user/create", response_model=User)
async def create_user(user: User):
return user
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)