In short - I have a backend on FastAPI (i.e. snake_case is used) and frontend on React (i.e. camlCase is used) and I want that when data comes to Pydantic model - snake_case is used for validation and camlCase is used for serialization. I currently have such a model:
class Clan(Document):
id: str = Field(default_factory=get_clan_id, pattern=cfg.regexC)
name: str = Field(..., max_length=100)
icon_url: Optional[str] = Field(None, max_length=255)
owner: Link[User] = Field(...)
premium: Premium = Field(default_factory=Premium)
admins: list[LowUserPublic] = Field(default=[])
leaders: list[LowUserPublic] = Field(default=[])
created_at: int = Field(default_factory=utc_now_timestamp)
model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True, from_attributes=True)
And such a route:
@router.get('/').
async def get_clans(
page: int = Query(1, ge=1),
limit: int = Query(5, ge=1, le=10),
payload: dict = Depends(login_required)
):
skip = (page - 1) * limit
user_id: str = payload.get('userId')
clans = await Clan.find({
'$or': [
{'owner.$id': user_id},
{'leaders.id': user_id},
{'admins.id': user_id}
]
}).skip(skip).limit(limit).to_list(limit)
If not clans:
return JSONResponse({'clans': []})
return JSONResponse({'clans': jsonable_encoder(
clans, include=['id', 'name', 'icon_url', 'premium', 'created_at'], by_alias=True)})