在 Pydantic 模型使用中,序列化时自动排除具有默认值的字段是一个常见需求。通过合理配置,可以让输出结果只保留真正被赋值的数据,减少不必要的信息传输。

为什么需要排除默认值字段
当模型字段较多且大部分使用默认值时,直接调用 dict() 或 json() 会把所有字段都输出。这样不仅报文体积变大,前端在处理时也难以区分哪些是用户真实修改的值。因此在序列化阶段屏蔽默认值字段,对接口整洁性和数据处理都有实际意义。
Pydantic 提供的排除参数
Pydantic 的模型序列化方法支持多个排除相关的参数,最常用的是 exclude_unset 和 exclude_defaults。
- exclude_unset:排除没有被显式赋值的字段,也就是保持初始未设置状态的字段。
- exclude_defaults:排除值等于字段默认值的字段,无论该字段是否被赋值。
- exclude_none:排除值为 None 的字段。
使用 exclude_unset 的示例
以下代码演示如何定义模型并在序列化时排除未设置的字段:
from pydantic import BaseModel
class User(BaseModel):
name: str = '匿名'
age: int = 18
email: str = ''
# 只显式设置 name
u = User(name='张三')
# 排除未显式设置的字段
print(u.dict(exclude_unset=True))
# 输出: {'name': '张三'}
使用 exclude_defaults 的示例
如果希望连被赋值为默认值的情况也排除,可以使用 exclude_defaults:
from pydantic import BaseModel
class User(BaseModel):
name: str = '匿名'
age: int = 18
u = User(name='匿名', age=20)
# 排除值等于默认值的字段
print(u.dict(exclude_defaults=True))
# 输出: {'age': 20}
在模型配置中统一设置
如果希望整个模型在序列化时都默认排除默认值,可以通过 Config 类配置:
from pydantic import BaseModel
class Product(BaseModel):
title: str = ''
price: float = 0.0
class Config:
# 注意:此配置不会自动作用于 dict()
# 仅作为示例说明参数存在
pass
p = Product(title='笔记本')
# 手动传入参数实现排除
print(p.dict(exclude_defaults=True))
# 输出: {'title': '笔记本'}
实际选择建议
在大多数 Web 接口场景里,exclude_unset 更加常用,因为它能准确反映客户端实际提交或代码显式修改的内容。而 exclude_defaults 适合在需要对比对象与初始模板差异时使用。理解两者差异后,就能在 Pydantic 中轻松实现序列化时自动排除具有默认值的字段。