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

如何在Pydantic序列化过程中排除带有默认值的字段?

解决Pydantic序列化时排除默认值字段,反序列化保留默认值的问题

要实现序列化时移除默认值字段,同时反序列化后自动填充默认值,只需利用Pydantic提供的exclude_unset参数即可,以下是具体实现方式:

方法一:序列化时显式指定排除未设置字段

直接在序列化时使用model_dump()(Pydantic v2)或dict()(Pydantic v1)方法,并传入exclude_unset=True,该参数会让Pydantic只序列化被显式赋值的字段,默认值字段未被修改时不会出现在结果中。

Pydantic v2 示例代码

import json
from typing import List
from pydantic import BaseModel

class Animal(BaseModel):
    name: str
    legs: int
    tails: int = 1

class AnimalList(BaseModel):
    animals: List[Animal]

animals = AnimalList(animals=[
    Animal(name='dog', legs=4),
    Animal(name='human', legs=2, tails=0)
])

# 获取排除默认值的字典并转为JSON
j = json.dumps(animals.model_dump(exclude_unset=True), indent=2)
print(j)

# 反序列化时自动填充默认值
animals = AnimalList.model_validate_json(j)

for animal in animals.animals:
    print(f"The {animal.name} has {animal.legs} legs and {animal.tails} tails.")

Pydantic v1 示例代码

如果使用Pydantic v1,替换对应方法即可:

import json
from typing import List
from pydantic import BaseModel

class Animal(BaseModel):
    name: str
    legs: int
    tails: int = 1

class AnimalList(BaseModel):
    animals: List[Animal]

animals = AnimalList(animals=[
    Animal(name='dog', legs=4),
    Animal(name='human', legs=2, tails=0)
])

# v1中使用dict(exclude_unset=True)
j = json.dumps(animals.dict(exclude_unset=True), indent=2)
print(j)

# v1中使用parse_raw反序列化
animals = AnimalList.parse_raw(j)

for animal in animals.animals:
    print(f"The {animal.name} has {animal.legs} legs and {animal.tails} tails.")

方法二:全局配置模型默认排除未设置字段

如果希望所有序列化操作都自动排除默认值字段,可以在模型的配置中全局设置:

Pydantic v2 全局配置

from typing import List
from pydantic import BaseModel

class Animal(BaseModel):
    name: str
    legs: int
    tails: int = 1

    # 全局配置该模型序列化时排除未设置字段
    model_config = {"exclude_unset": True}

class AnimalList(BaseModel):
    animals: List[Animal]

    model_config = {"exclude_unset": True}

animals = AnimalList(animals=[
    Animal(name='dog', legs=4),
    Animal(name='human', legs=2, tails=0)
])

# 直接生成JSON字符串,无需额外参数
j = animals.model_dump_json(indent=2)
print(j)

animals = AnimalList.model_validate_json(j)
for animal in animals.animals:
    print(f"The {animal.name} has {animal.legs} legs and {animal.tails} tails.")

Pydantic v1 全局配置

from typing import List
from pydantic import BaseModel

class Animal(BaseModel):
    name: str
    legs: int
    tails: int = 1

    class Config:
        exclude_unset = True

class AnimalList(BaseModel):
    animals: List[Animal]

    class Config:
        exclude_unset = True

animals = AnimalList(animals=[
    Animal(name='dog', legs=4),
    Animal(name='human', legs=2, tails=0)
])

j = json.dumps(animals.dict(), indent=2)
print(j)

animals = AnimalList.parse_raw(j)
for animal in animals.animals:
    print(f"The {animal.name} has {animal.legs} legs and {animal.tails} tails.")

以上两种方式都能实现预期效果:序列化结果中不会包含默认值字段(比如dog的tails),反序列化后Pydantic会自动为缺失的字段填充默认值。

内容的提问来源于stack exchange,提问作者user66554

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 03:35:42