当前位置: 首页 > article >正文

Pydantic 数据验证

Pydantic 验证

from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel, EmailStr, field_validator, ValidationError

def check_name(v: str) -> str:
    """Validator to be used throughout"""
    if not v.startswith("小"):
        raise ValueError("must be startswith 小")
    return v

class User(BaseModel):
    id: int
    name: str = "小卤蛋"
    age: int
    # email: EmailStr
    signup_ts: Optional[datetime] = None
    friends: List[str] = []

    validate_fields = field_validator("name")(check_name)

    @field_validator("age")  # 此处在pycharm中有warning,上下顺序不能变
    @classmethod
    def check_age(cls, age):
        if age < 18:
            raise ValueError("用户年龄必须大于18岁")
        return age

if __name__ == '__main__':
    user_data = {
        "id": 123,
        "name": "小卤蛋",
        "age": 12,
        "email": "xiaoludan@example.com",
        'signup_ts': '2024-07-19 00:22',
        'friends': ["公众号:海哥python", '小天才', b''],
    }
    try:
        user = User(**user_data)
        print(user)
    except ValidationError as e:
        print(f"Validation error: {e.json()}")

调用BaseModel内部参数作为判断条件

class RegisterParams(BaseModel):
    visibility: VisibilityEnum = Field(VisibilityEnum.PRIVATE)
    publish_type: int = Field(..., description="类型")
    dept_codes: List[str] = Field(..., description="部门")

    @field_validator("publish_type")
    @classmethod
    def check_publish_type(cls, publish_type, values):
        visibility = values.data.get('visibility').value
        if visibility == 'public':
            publish_type = 0
        elif visibility == 'private':
            publish_type = 1
        else:
            publish_type = 2

        if publish_type not in [0, 1, 2]:
            raise ValueError("publish_type number is wrong.")

        return publish_type

    @field_validator("dept_codes")
    @classmethod
    def check_dept_codes(cls, dept_codes, values):
        visibility = values.data.get('visibility').value
        if visibility == 'internal':
            raise ValueError("dept_codes must be provided, can not be None or [].")
        return dept_codes

参考:

Pydantic:目前最流行的Python数据验证库_python pydantic-CSDN博客

Models - Pydantic


http://www.kler.cn/a/412276.html

相关文章:

  • gRPC 双向流(Bidirectional Streaming RPC)的使用方法
  • “华为杯”研究生数学建模比赛历年赛题汇总(2004-2024)
  • uniapp中使用Mescroll实现下拉刷新与上拉加载项目实战
  • ChatGPT如何辅助academic writing?
  • 101.【C语言】数据结构之二叉树的堆实现(顺序结构) 2
  • 【8210A-TX2】Ubuntu18.04 + ROS_ Melodic + TM-16多线激光 雷达评测
  • 1- 9 C 语言面向对象
  • 差分 + 模拟,CF 815A - Karen and Game
  • 实现qt拖拽显示或者播放
  • linux 存储学习(nas)
  • 深入解析 MySQL 索引失效的原因与优化策略
  • 适合中小型公司的自动化测试的测试框架,OpenSourceTest
  • 最新 Blender 4.2 保姆级安装教程(附安装包)
  • Dockerfile常用指令
  • 【Go语言成长之路】编写web应用
  • 深入解读 MongoDB 查询耗时:Execution 和 Fetching 阶段详解
  • BERT的中文问答系统36-1
  • 文件的处理(c语言)
  • BP神经网络的训练窗口详解,BP神经网络详细原理,基于BP神经网络的多分类预测
  • Ubuntu20.04运行DM-VIO
  • Jmeter的组件执行顺序
  • mongodb shard 分片集群基础概念
  • Linux的make/Makefile和进度
  • vueuse中的useTemplateRefsList
  • Python中的23种设计模式:详细分类与总结
  • 【Angular】async详解