pydantic 如何删除非必填字段

449 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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的字段了。