如何在Pydantic V2中为子类日期字段统一设置序列化格式?
在Pydantic V2中为所有日期字段统一设置序列化格式
问题描述
我定义了一个继承自Pydantic BaseModel的基类CustomBaseModel,希望所有继承该基类的子类模型里的日期字段都用统一格式(如%Y-%m-%d)序列化。之前用ConfigDict的json_encoders实现,但该方法已被弃用;尝试@model_serializer却绕过了别名生成器,现寻求更简洁的合规方案。
代码示例:
from datetime import date from pydantic import BaseModel class CustomBaseModel(BaseModel): # 在这里指定日期格式 pass class ChildClassModel(CustomBaseModel): created_at: date updated_at: date # 希望这些日期字段,以及所有继承CustomBaseModel的模型中的日期字段,都序列化为%Y-%m-%d格式
解决方案
可以利用Pydantic V2的@field_serializer结合broadcast=True参数,在基类中为date类型全局定义序列化规则,既覆盖所有子类的同类型字段,又不会破坏别名生成逻辑。
实现代码
from datetime import date from pydantic import BaseModel, field_serializer class CustomBaseModel(BaseModel): @field_serializer('date', when_used='always', broadcast=True) def serialize_date(self, value: date) -> str: return value.strftime('%Y-%m-%d') class ChildClassModel(CustomBaseModel): created_at: date updated_at: date # 测试验证 obj = ChildClassModel(created_at=date(2024, 5, 10), updated_at=date(2024, 5, 11)) print(obj.model_dump_json()) # 输出: {"created_at":"2024-05-10","updated_at":"2024-05-11"}
参数说明
'date':指定要匹配的字段类型为datewhen_used='always':确保无论字段是否有默认值,都会触发该序列化器broadcast=True:让序列化规则自动应用到所有子类的同类型字段
扩展支持datetime类型
如果需要同时处理datetime字段,可直接在装饰器中添加类型:
from datetime import date, datetime class CustomBaseModel(BaseModel): @field_serializer('date', 'datetime', when_used='always', broadcast=True) def serialize_dates(self, value: date | datetime) -> str: if isinstance(value, datetime): return value.strftime('%Y-%m-%d %H:%M:%S') return value.strftime('%Y-%m-%d')
该方案完全替代了弃用的json_encoders,同时保留了Pydantic的原生特性(包括别名生成)。
内容的提问来源于stack exchange,提问作者TheGrumpyDev
相关产品推荐
相关产品推荐

