FastAPI中Pydantic BaseModel关联校验:relation_type非空时document_list需非空
实现Pydantic模型的关联字段校验
要实现当relation_type存在时document_list必须非空的校验逻辑,你可以使用Pydantic的模型验证器(model_validator),在字段单独校验完成后执行关联逻辑检查。以下是具体实现:
from pydantic import BaseModel, Field, Annotated, model_validator, ValidationError from typing import Optional, List from enum import Enum class TipoRelacionEnum(str, Enum): nota_credito = "01" nota_debito = "02" devolucion_mercancias = "03" sustitucion = "04" traslado = "05" facturacion_generada = "06" anticipo = "07" class Cfdi(BaseModel): relation_type: Optional[Annotated[TipoRelacionEnum, Field(title="Tipo de Relación", description="""Se debe registrar la clave de la relación que existe entre este comprobante que se está generando y el o los CFDI previos.""", examples=[ "04", "01", ], max_length=2)]] = None document_list: Optional[List[str]] = None @model_validator(mode='after') def check_document_list_when_relation_type_exists(self) -> 'Cfdi': # 当relation_type有值时,校验document_list必须非空 if self.relation_type is not None: if not self.document_list: # 匹配None或空列表 raise ValueError("当指定relation_type时,document_list必须至少包含一个元素") return self
关键说明
- 使用
@model_validator(mode='after')确保在所有字段的基础校验(比如枚举类型、长度限制)完成后,再执行关联逻辑校验。 - 校验逻辑:如果
relation_type不为None,则检查document_list是否为None或空列表,若是则抛出ValueError,Pydantic会自动将其转换为ValidationError并返回给FastAPI。
测试示例
你可以通过以下代码验证校验逻辑是否生效:
# 非法案例:指定relation_type但document_list为空 try: invalid_cfdi = Cfdi(relation_type=TipoRelacionEnum.nota_credito, document_list=[]) except ValidationError as e: print(e.json()) # 合法案例:指定relation_type且document_list非空 valid_cfdi1 = Cfdi(relation_type=TipoRelacionEnum.sustitucion, document_list=["CFDI-001"]) print(valid_cfdi1) # 合法案例:未指定relation_type,document_list可空 valid_cfdi2 = Cfdi(document_list=None) print(valid_cfdi2)
内容的提问来源于stack exchange,提问作者Ernesto Ruiz
相关产品推荐
相关产品推荐

