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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:16:31