FastAPI jsonencoder 总是 returns 驼峰式而不是 snake_case
FastAPI jsonencoder always returns camelCase instead of snake_case
我在 snake_case 中有一个数据对象和一个使用 snake_case 的数据库模式。我只是想在数据库中创建一个新行。为此,我必须先序列化数据对象。不幸的是,当我使用默认的 fastAPI 序列化程序时,我总是得到一个驼峰式对象。当然,我可以使用另一个库将序列化的 camelCase 数据再次转换为 snake_case,但必须有更简单的方法。
class CRUDPost(CRUDBase[Post, PostCreate, PostUpdate]):
def create(self, db: Session, obj_in: PostCreate, created_by: UUID4) -> Post:
logger.info(obj_in) // => obj in snake_case
obj_in_data = jsonable_encoder(obj_in, by_alias=True)
logger.info(obj_in_data) => obj in camelCase
db_obj = self.model(**obj_in_data, created_by=created_by)
db.add(db_obj)
db.commit()
db.refresh(db_obj)
return db_obj
编辑:
Camelcase 中的对象:{'leetcodeSubmissions': 0, 'interviewTimeline': 0}
snake_case 中的对象:{'leetcode_submissions': 0, 'interview_timeline': 0}
如果我的猜测是正确的,那么这就是 jsonable_encoder
的预期行为。
基于这一行:
obj_in_data = jsonable_encoder(obj_in, by_alias=True)
我认为你的 PostCreate
已经为其字段设置了别名,它们是驼峰式命名,你正在 Pydantic 模型上调用 jsonable_encoder
,它将 class 的实例转换为 Python字典。尝试将 by_alias
设置为 False
,它应该可以解决您的问题。
我在 snake_case 中有一个数据对象和一个使用 snake_case 的数据库模式。我只是想在数据库中创建一个新行。为此,我必须先序列化数据对象。不幸的是,当我使用默认的 fastAPI 序列化程序时,我总是得到一个驼峰式对象。当然,我可以使用另一个库将序列化的 camelCase 数据再次转换为 snake_case,但必须有更简单的方法。
class CRUDPost(CRUDBase[Post, PostCreate, PostUpdate]):
def create(self, db: Session, obj_in: PostCreate, created_by: UUID4) -> Post:
logger.info(obj_in) // => obj in snake_case
obj_in_data = jsonable_encoder(obj_in, by_alias=True)
logger.info(obj_in_data) => obj in camelCase
db_obj = self.model(**obj_in_data, created_by=created_by)
db.add(db_obj)
db.commit()
db.refresh(db_obj)
return db_obj
编辑:
Camelcase 中的对象:{'leetcodeSubmissions': 0, 'interviewTimeline': 0}
snake_case 中的对象:{'leetcode_submissions': 0, 'interview_timeline': 0}
如果我的猜测是正确的,那么这就是 jsonable_encoder
的预期行为。
基于这一行:
obj_in_data = jsonable_encoder(obj_in, by_alias=True)
我认为你的 PostCreate
已经为其字段设置了别名,它们是驼峰式命名,你正在 Pydantic 模型上调用 jsonable_encoder
,它将 class 的实例转换为 Python字典。尝试将 by_alias
设置为 False
,它应该可以解决您的问题。