如何在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
相关产品推荐
相关产品推荐

