如何在Pydantic设置exclude_unset=True时指定包含特定字段
解决Pydantic中exclude_unset与指定包含默认字段的冲突问题
在Pydantic 2.x版本中,exclude_unset=True会仅保留显式赋值的字段(即使字段有默认值,未被显式设置也会被排除),而include参数是在这个过滤后的结果集里做二次筛选——这就是你调用x.model_dump(exclude_unset=True, include={'b'})返回空字典的原因:b是默认值,不在exclude_unset的结果里,include自然找不到匹配项。
要实现「排除未设置字段,但手动指定包含部分默认字段」的需求,有两种简单可行的方案:
方案一:手动合并结果集
先获取exclude_unset=True的基础结果,再手动添加需要包含的默认字段:
from pydantic import BaseModel, Field class A(BaseModel): a: str b: str = Field(default='bbb', frozen=True) c: str = Field(default='ccc') x = A(a='aaa') # 1. 获取排除未设置字段的基础结果 base_result = x.model_dump(exclude_unset=True) # 2. 添加需要额外包含的字段 base_result['b'] = x.b print(base_result) # 输出: {'a': 'aaa', 'b': 'bbb'}
如果需要批量添加多个字段,可用循环处理避免重复代码:
extra_include_fields = ['b'] for field in extra_include_fields: if field in x.model_fields: # 确保字段存在于模型中 base_result[field] = getattr(x, field)
方案二:封装自定义dump方法
如果需要多次复用这个逻辑,可以封装一个通用函数:
def custom_model_dump(model, exclude_unset=True, include_extra=None): result = model.model_dump(exclude_unset=exclude_unset) if include_extra: for field in include_extra: if field in model.model_fields: result[field] = getattr(model, field) return result # 调用示例 result = custom_model_dump(x, include_extra=['b']) print(result) # 输出: {'a': 'aaa', 'b': 'bbb'}
原理说明
Pydantic的model_dump参数执行顺序是:先根据exclude_unset/exclude_defaults等规则过滤字段,再应用include/exclude的筛选。因此直接组合exclude_unset=True和include无法包含未被显式设置的默认字段,需要手动补充这些字段的值。
内容的提问来源于stack exchange,提问作者Dyson
相关产品推荐
相关产品推荐

