You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 19:14:55