开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
书接上文,上篇文章我们简单学习到了pydantic的一些简单使用方法,今天暂时来个番外篇,明天再更新主线内容。
今天在来教一招!如何去除经过pydantic序列化的后None的key
下面有一个非常常见的使用场景: 在我们日常使用场景下,往往会为某个key增加默认值,以便一些特殊情况,默认值则有可能是None,但是此时前端中学来需求了,你可以不可以不传值为None的字段啊。但是由于使用了pydantic 作为参数校验,导致出现一些非必填字段出现如下的一些情况:
class User(BaseModel):
name: str = ...
age: int = Field(None,)
address: str = Field(None)
user = User(
name='yoyo',
)
print(user.dict()) # {'name': 'yoyo','age': None, 'address': None}
这是因为使用pydantic来定义数据模型是,有些非必填字段,通过pydantic这个一通检查给加上一个None字段,但是有些情况我们不需要这些字段,想将一些没有value的字段消失,那么怎么操作呢?
方式1:直接删除对这个字段的校验
class User(BaseModel):
name: str = ...
age: int = Field(None,)
user = User(
name='yoyo',
)
print(user.dict()) # {'name': 'yoyo','age': None}
但是这样会引入一个新的问题,就是当address 有值的时候就无法校验了,只有当这个字段一定不会出问题且并不重要的时候才建议如此使用,大部分情况是不建议如此使用的,那么肯定是有别的方法的。
方法二:exclude_unset
BaseModel 实力化后提供了dict()和json()方法,这里面就有一个参数exclude_unset, 在较为老的版本中这个参数是skip_defaults,可以通过设置exclude_unset参数且值为true时,可以跳过默认的设置项。
如下
class User(BaseModel):
name: str = ...
age: int = Field(None,)
user = User(
name='yoyo',
)
print(user.dict(exclude_unset=True))
# {'name': 'yoyo'}
这样就很简单的去掉了默认值为None的字段了。