如何使用Pydantic验证模型中end_date晚于init_date?
解决Pydantic模型中end_date晚于init_date的校验问题
方法一:字段级校验器(Pydantic v2+)
用@field_validator针对end_date做跨字段校验,确保它晚于init_date:
from pydantic import BaseModel, field_validator, ValidationError from datetime import date class DateRangeModel(BaseModel): init_date: date end_date: date @field_validator('end_date') def end_must_be_after_init(cls, value, info): init_date = info.data.get('init_date') if init_date and value <= init_date: raise ValueError('end_date必须晚于init_date') return value # 测试示例 try: valid_case = DateRangeModel(init_date=date(2024, 3, 1), end_date=date(2024, 3, 10)) print("校验通过:", valid_case) except ValidationError as e: print("校验失败:", e.errors())
方法二:模型级校验器
如果需要更复杂的跨字段逻辑,用@model_validator做全局校验:
from pydantic import BaseModel, model_validator, ValidationError from datetime import date class DateRangeModel(BaseModel): init_date: date end_date: date @model_validator(mode='after') def check_date_order(self): if self.end_date <= self.init_date: raise ValueError('end_date必须晚于init_date') return self # 测试非法场景 try: invalid_case = DateRangeModel(init_date=date(2024, 3, 10), end_date=date(2024, 3, 1)) except ValidationError as e: print("校验失败:", e.errors())
额外:计算天数差
校验通过后,直接通过日期对象的减法计算天数差:
delta = valid_case.end_date - valid_case.init_date print(f"两日期间隔: {delta.days} 天")
内容的提问来源于stack exchange,提问作者Adão Oliveira
相关产品推荐
相关产品推荐

