Pydantic如何分离field和alias

问题分析

即假如需要返回的是:

{
    "isStar": ture
}

在python中一般不使用isStar这种命名方式, 所以我们需要使用别名定义模型:

class TestModel(BaseCategoryModel):
    is_star: bool = Field(..., alias="isStar")

而且在SQLAlchemy中也要定义相关字段, 也是由于命名的习惯性, 定义为:

class Test(Base):
    __tablename__ = 'Test'
    is_star = Column(Boolean, nullable=False, default=False, comment="是否星标"

但是假如我们直接让Pydantic从ORM中读取数据的话, 会报错, 原因也很简单

问题解决

TestModel这个模型接收和输出的都是别名后的字段, 即isStar
Test这个表中没有该字段, 所以会报错!

也就是说, 只需要我们让Pydantic输出isStar但接收的是is_star , 不就完美解决了吗!
为此我去Github上看了一下Issues: #2429, 发现了一个差不多的issue, 然后看了一下官方文档:
发现了allow_population_by_field_name配置( 在v1.0之前是allow_population_by_alias), 该配置为: 别名字段是否可以 由模型属性给出的名称以及别名填充
所以修改后的TestModel模型为:

class TestModel(BaseCategoryModel):
    is_star: bool = Field(..., alias="isStar")
	
    class Config:
        orm_mode = True
        allow_population_by_field_name = True

如此便可以让TestModel接收is_star 而返回的是isStar

posted @ 2022-02-17 14:32  403·Forbidden  阅读(378)  评论(0编辑  收藏  举报